事务、事务四大特性、事务隔离级别、事务的传播行为 理解

事务执行结束的结果有两种:

        当事务中所有步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消之前到事务开始时的所有操作。

事务要满足的四大特性

事务必须服从ACID原则

所以:如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

(1)原子性(Atomicity)

       事务是一个不可分割的整体,指事务的所有操作要么全部成功,要么全部失败回滚

(2)一致性(Consistency)

      一个事务执行之前和执行之后,数据库数据都必须处于一致性状态。

如:
    拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

 (3)隔离性(Isolation)

       多个并发事务之间要相互隔离(多个事务并发执行时,为了保证数据的安全性,事务之间要相互隔离,不能相互干扰)

(4)持久性(Durability)

    事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

 事务隔离级别和可能出现的问题

 多个事务并发执行时,如果不考虑事务的隔离性,会发生的几种问题:

(1)脏读

       一个事务处理过程里读取了另一个事务尚未提交的数据。

如:一个事务读到了另一个事务未提交的数据,如果另一个事务出现了回滚,那么该事务读到的数据就无效的

(2)不可重复读

       一个事务对数据的操作导致了另一个事务前后多次查询却得到了或读到了不同的数据。

       在一个事务中前后两次读取的结果并不致,导致了不可重复读。(同样的条件,你读取过的数据,再次读取出来发现 

       值不一样了。)

如:一个事务查询数据后,另外一个事务更改了数据,这个事务再次去查询的时候前后两次查询得到的数据不一样

(3)虚读(幻读)

        一个事务对数据的操作导致了另一个事务前后多次查询得到的结果数量不一样。

      在一个事务中前后两次读取的结果数量不一样,导致了虚读

如:一个事务查询数据后,另外一个事务删除了一条数据,这个事务再次去查询的时候前后两次查询得到的结果条数不一样

 

 事务隔离级别:(解决多个事务并发执行时可能出现的脏读、不可重复读、虚读读问题

Read Uncommitted 未提交读

       一个事务未提交的数据可以被别的事务读到,可能导致:脏读、不可重复读、幻读(若有事务并发问题都可能出现)

Read Committed 已提交读

       一个事务只有已经提交的数据才可以被别的事务读到。 解决了脏读,可能导致不可重复读、幻读

Repeatable Read 可重复读

       事务并发执行时,它可以确保同一事务的多次读取数据时,读到的是相同的数据。会看到同样的数据行。解决了脏读、不可重复读,可能出现幻读。

Serializable  可序列化

         最高的隔离级别,它通过强制事务排序,使之不可能相互冲突。保证了不会出现脏读、不可重复读、幻读。

简言之,它是在每个读的数据行上加上共享锁(读锁,简称S锁)。可能导致大量的超时现象和锁竞争。

       

事务隔离级别越高,为了避免冲突所花的精力也就越多

Spring事务的7种传播行为 

事务传播行为(propagation behavior):

            指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 

 

Spring定义了七种传播行为:

            PROPAGION_XXX :事务的传播行为 

* 保证同一个事务中 
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认) 
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务 
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常 
* 保证没有在同一个事务中 
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务 
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务 
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常 
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

 

参考:

       https://www.cnblogs.com/fjdingsd/p/5273008.html

       https://blog.csdn.net/sunone_/article/details/79886834

       https://blog.csdn.net/weixin_38070406/article/details/78157603

       

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值