目录
一、事务的ACID
事务是一组不可分割的SQL操作,这组操作要么全部执行,要么全部不执行。
ACID是事务的四大特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)。
1.原子性
一个事务必须被视作一个不可再分割的最小工作单元。整个事务那么全部执行,要么全部不执行,对一个事务来说,不可能只执行其中的一部分,这就是事务的原子性。
其实这个性质是最好记的,“原子”这个词在希腊文中是“不可分”的意思,很贴切的形容了事务不可分割的性质。
2.一致性
数据库总是从一个一致性状态转换到另一个一致性状态。
3.隔离性
一个事务所做的修改在提交之前,其他事务对该事务每一个部分的执行都不知情。
4.持久性
一旦事务提交,则其所做的修改就会永久保存到数据库中。
二、隔离级别
事务是并发的基本单位,保证事务的ACID特性是事务处理的重要任务,但是多个事务对数据库的并发操作可能将其破坏。在SQL标准中定义了四中隔离级别,每一种级别都规定了一个事务对数据做了修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read uncommitted) | 可能 | 可能 | 可能 |
读已提交(read committed) | 不可能 | 可能 | 可能 |
可重复读(repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(serializable) | 不可能 | 不可能 | 不可能 |
1.读未提交(read uncommitted)
一个事务修改了数据,但是还没有提交,其他的事务就能读取这些已被修改的数据,也称为脏读(dirty read)。这个级别会导致很多问题,从性能上来说,读未提交不会比其他的级别好太多,但是缺乏其他级别的很多好处,在实际应用中一般很少使用。
2.读已提交(read committed)
解决了脏读的问题。大多数数据库系统的默认隔离级别都是这个,比如Sql Server和Oracle,注意MySQL不是。这个级别和ACID中的隔离性意思相同,即一个事务只能看到其他已提交的事务所做的修改。当一个事务还在进行,没有提交,它对数据的修改,其他事务是看不到的。
存在的问题是同一个事务,两次读取得到的结果可能不同,即不可重复读。
关于不可重读,详细可参考这篇文章,到此为止,理解脏读、不可重复读、幻读
3.可重复读(repeatable read)
解决了脏读、不可重复读的问题。这个级别保证了在一个事务内多次读取到的数据是一致的。
但是又存在幻读的问题。同理参考这篇文章,到此为止,理解脏读、不可重复读、幻读就能彻底分清不可重复读和幻读的区别。
4.可串行化(serializable)
最高的隔离级别,彻底解决了脏读、不可重复读、幻读的问题。
它强制事务只能串行执行即只能一个接着一个执行,不能并发。但是这个级别可能会导致大量的超时和锁争用的问题。实际应用中也很少用到这个级别。