做为一个码农,每天就是写写BUG这样子,最近遇到了一个问题,发现自己对数据库事务的理解不太够,找来相关内容,重新复习了一下,整理出来,和大家分享。
说到数据库的事务,就不得不说事务的四大特性:ACID
A:原子性(Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
就像转账,要么转账成功:你扣钱对方加钱,要么失败:你没扣钱对方也没加,不可能你扣了钱,对方却没收到,那就出大问题了。
C:一致性(Consistency)
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
I:隔离性(Isolation)
指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
D:持久性(Durability)
指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
事务的ACID是靠日志和锁保证的。
持久性通过Redolog 实现,事务提交之前,现将Redlog持久化,即使系统崩溃,提交失败了,系统重启后,也可以根据Redolog,将数据恢复到最新的状态。
原子性和一致性通过UndoLog实现,操作开始之前,先将旧数据备份,如果操作出错或者用户执行了Rollback,就根据UndoLod将数据恢复至事务开始之前的状态。
隔离性是通过数据库锁实现的,隔离有不同的级别,需要了解几个数据库的基本概念:
1. 脏读
一个事务读取到另一个事务未提交的更新数据。
2.不可重复读
在同一个事务中,多次读取同一数据返回的结果不同,和脏读不同的是这里读取的是已经提交过后的。
3.幻读
一个事务读到另一个事务已提交的insert数据。
具体的隔离级别如下:
隔离级别串行化是隔离级别最高的,但是在高并发环境中,会严重影响系统性能,需谨慎使用。
以上就是关于数据库事务的一些基本知识。
网友评论