数据库事务的特点与隔离级别

事务的四个特点

百度百科:数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

1.原子性(Atomicity):
事务中的一组操作是不可分割的,要么全部成功,要么全部撤销。

2.一致性(Consistency):
几个事务并发执行,其执行结果必须和按照某种顺序串行执行这些事务的效果是一样的。即事务执行前后,数据库的数据要保持一致性。

3.隔离性(Isolation):
事务的执行不受其它事务的影响,并发执行的几个事务,互不影响。事务执行的中间结果对其它事务必须是透明的(不可见)。

4.持久性(Durability):
对于任意已提交事务,系统事务对数据库的改变不被丢失,即使数据库出现故障。

事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。

√: 可能出现 ×: 不会出现
事务隔离级别

以下转自:https://www.cnblogs.com/wajika/p/6680200.html
4种隔离级别的相应原理总结如下:

READ_UNCOMMITED 的原理:

  • 事务对当前被读取的数据不加锁;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级共享锁,直到事务结束才释放。

表现:

  • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,能读到事务2对该记录的修改版本,即使该修改尚未被提交。
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

READ_COMMITED 的原理:

  • 事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

表现:

  • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的只能是事务2对其更新前的版本,要不就是事务2提交后的版本。
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

REPEATABLE READ 的原理:

  • 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

表现:

  • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的仍然是第一次读取的那个版本。
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

SERIALIZABLE 的原理:

  • 事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;
  • 事务在更新数据时,必须先对其加 表级排他锁 ,直到事务结束才释放。

表现:

  • 事务1正在读取A表中的记录时,则事务2也能读取A表,但不能对A表做更新、新增、删除,直到事务1结束。
  • 事务1正在更新A表中的记录时,则事务2不能读取A表的任意记录,更不可能对A表做更新、新增、删除,直到事务1结束。

猜你喜欢

转载自blog.csdn.net/zht666/article/details/51691958