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

一、事物的传播特性:

属性名称描 述
PROPAGATION_REQUIREDrequired支持当前事务。有事务就加入这个事务;没有事务则创建新的事务,默认
PROPAGATION_SUPPORTSsupports支持当前事务。有事务就加入这个事务;没有事务就以非事务方式执行。
PROPAGATION_MANDATORYmandatory支持当前事务。如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEWrequires_new将创建新的事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTEDnot_supported不支持当前事务,总是以非事务状态执行。如果没有,就以非事务方式执行;如果有,就将当前事务挂起。
PROPAGATION_NEVERnever不支持当前事务,如果当前存在事务,则抛出异常。
PROPAGATION.NESTEDnested

嵌套事务,底层将使用 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):一个事物在执行过程中完全看不到其他事物对数据库所做的更新,可避免脏读、不可重复读、幻读的发生。
 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值