数据库事务
四大特性
原子性 隔离性 持久性 一致性
原子性
一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。
一致性
事务操作成功后,数据库所处的状态和他的业务规则是一致的,即数据不会被破坏。如A账户转账100元到B账户,不管操作成功与否,A和B账户的存款总额是不变的。
隔离性
事务之间有一定的隔离级别,保障不同程度的数据一致性。
持久性
一旦事务提交成功后,事务中所有的数据都被持久化到数据库中。
隔离带来的问题及对应的解决级别
-
丢失更新
第一类
最低的隔离级别Read uncommited即可防止此问题,对应一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
第二类
此类问题只能通过可以通过乐观锁或悲观锁进行控制。
-
脏读
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k8wiVjy8-1583551659525)(images\脏读.png)]
脏读的解决方案:设置隔离级别为读已提交。对应的封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁(瞬间S锁)。 -
不可重复读
不可重复读的解决方案:设置隔离级别为可重复读。对应的封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
- 幻读
幻读的解决方案:序列化。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。