数据库事务

四大特性

原子性 隔离性 持久性 一致性

原子性

一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。

一致性

事务操作成功后,数据库所处的状态和他的业务规则是一致的,即数据不会被破坏。如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锁,直到事务结束才释放。

  • 幻读

数据库事务及隔离级别
幻读的解决方案:序列化。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。

相关文章: