数据库事务的ACID与隔离级别


一、事务的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)

最高的隔离级别,彻底解决了脏读、不可重复读、幻读的问题。
它强制事务只能串行执行即只能一个接着一个执行,不能并发。但是这个级别可能会导致大量的超时和锁争用的问题。实际应用中也很少用到这个级别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值