事物的特性、传播特性及隔离级别

一、事物的传播特性:

属性名称 值 描 述 PROPAGATION_REQUIRED required 支持当前事务。有事务就加入这个事务;没有事务则创建新的事务,默认 PROPAGATION_SUPPORTS supports 支持当前事务。有事务就加入这个事务;没有事务就以非事务方式执行。 PROPAGATION_MANDATORY mandatory 支持当前事务。如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW requires_new 将创建新的事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED not_supported 不支持当前事务,总是以非事务状态执行。如果没有,就以非事务方式执行;如果有,就将当前事务挂起。 PROPAGATION_NEVER never 不支持当前事务,如果当前存在事务,则抛出异常。 PROPAGATION.NESTED nested 嵌套事务,底层将使用 Savepoint 形成嵌套事务。 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

 二、事务的四大特性

1.原子性(Atomicity):

事务中所有操作是不可分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

2.一致性(Consistency):

事务执行后,数据库状态与其它业务规则保持一致。如转正业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

3.隔离性(Isolation):

隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

4.持久性(Durability):

一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须你能保证通过某种机制恢复数据。

三、并发事务引起的问题

脏读(Dirty reads):

脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。

不可重复读(Nonrepeatable read)

不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。

幻读(Phantom read)

幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。

注:

  1. 不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
  2. 幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样 。

四、事务的隔离级别

Spring的事物本质其实就是数据库对事物的支持,没有数据库的事务支持,Spring是无法提供事务功能的,真正的数据库层的事务提交和回滚是通过binlog实现的,隔离级别有四种:

读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到,最低级别,任何情况都不能保证。

读已提交(read committed):一个事务提交以后,它做的变更才会被其它事务看到,而且能看到该事务对已有记录的更新,可以避免脏读的发生。

可重复读(repeatable read):保证事务修改后的数据提交后才能被另一事务读取,,但是不能看到该事物对已有记录的更新,可避免脏读、不可重复读的的发生。Mysql innerDB 默认隔离级别。

串行化(serializable):一个事物在执行过程中完全看不到其他事物对数据库所做的更新,可避免脏读、不可重复读、幻读的发生。

经验分享 程序员 微信小程序 职场和发展