Spring事务传播属性和隔离级别

Spring事务传播属性和隔离级别

🍅程序员小王的博客:程序员小王的博客
🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
🍅java自学的学习路线:java自学的学习路线

一、Spring事务传播属性(propagation)

1、propagration(事务传播属性)产生场景:

  • Service可以调用一个或者多个Dao方法,但是在使用Spring之前我们只能调用dao层,但是不能调用另外一个Service层中的方法

案例:在UserService.java中有方法 save().其中嵌套AddressService.java中update()。当UserService事务发生rollback时, AddressService事务也可以rollback或是commit。

public class UserService {
    
    public void save() {
        
        UserService.update();//AddressService对象uodate操作
    }
    
}

2、七个事务传播属性

  • REQUIRED: 需要事务,外部存在事务融入当前事务,外部没有事务,开启新的事务 【增删改操作常用】

  • SUPPORTS: 支持事务,外部存在事务融入当前事务,外部没有事务,不开启新的事 【查询操作常用

  • REQUIRES_NEW: 每次开启新的事务,如果外部存在事务外部事务挂起(暂停),开启新的事务运行,运行结束后恢复外部事务 【日志,流水操作】

    案例分析:转账业务操作:转账,Account,App都是业务层

  • NOT_SUPPORTED: 不支持事务,如果外部存在事务外部事务挂起,已非事务方式运行.

  • NEVER: 不支持事务,存在事务报错

  • MANDATORY: 强制事务没有事务报错

  • NESTED: 嵌套事务,数据库不支持

二、隔离级别isolation

isolation:[ˌaɪsəˈleɪʃn]
:隔离

1、事务特性(事务的基本要素)

事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功。其必须遵循四个原则(ACID )。

  • ACID指:原子性,一致性,隔离性 ,持久性
(1)原子性(Atomicity [ˌatəˈmɪsɪti]):
  • 定义:指一个事务要么全部执行,要么不执行 ,也就是说一个事务不可能只执行了一半就停止了.

如:你从取款机取钱,这个事务可以分成两个步骤: 1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。

(2)一致性(Consistency[kənˈsɪstənsi]):
  • 定义:在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整性约束没有被破坏;

如:银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。

(3)隔离性(Isolation [ˌaɪsəˈleɪʃn]
  • 定义:并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性;
(4)持久性(Durability[ˌdʊrəˈbɪləti]
  • 定义:事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。

2、隔离性(事务的隔离级别)

isolation :隔离级别 多个客户端间操作的隔离性【Client——>Service】

(1)DEFAULT: 采用数据库默认隔离级别(Spring提供的)
  • Spring框架提供的隔离级别,当前使用的数据库对应的默认隔离级别
(2)READ_UNCOMMITTED: 读未提交
  • 解析:不同客户端之间可以在一次事务中读取到其他客户端没有提交的事务

在这里插入图片描述

(3)READ_COMMITTED: 读提交 用来避免脏读现象出现的
  • read_ommited:oracle默认隔离级别
  • 解析:不同客户端之间可以在一次事务中读取到其他客户端已经提交的事务
(4)REPEATABLE_READ: 可重复读主要是用来避免不可重复读现象出现的
  • 单词:repeatable:[rɪˈpi:təbl] 可重复的
  • repeatable_read:mysql默认隔离级别
  • 解析:在一次事务中一方更新,导致两次查询结果不一致这种情况叫不可重复读

(5)SERIALIZABLE : 序列化读 用来避免幻影读现象出现
  • 幻影读概念:在一次事务中一方插入,导致两次查询结果不一致这种情况叫幻影读

  • 解析:一个客户端在一次事务中多次读取一张表的数据 结果一致

隔离级别隔离级别值脏读不可重复读幻读
未提交读(Read-Uncommitted)0
提交读(不可重复读 )(Read-committed)1
可重复读(repeatable-read)2
串行化 (serializable)3

隔离级别的特点:隔离级别从低到高,级离级别越高越安全, 但是锁的内容越高,效率越低

三、读写和异常性

1、read-only(只读性):设置当前方法是否只读

true:只读

false:不是只读【默认值】

  <tx:method name="save*" propagation="REQUIRES_NEW" read-only="true|false" isolation="SERIALIZABLE"/>

2、回滚性(rollback-for && no-rollback-for="")

rollback-for: 遇到什么类异常回滚

no-rollback-for: 遇到什么类异常不回滚

  <tx:method name="save*" rollback-for="" no-rollback-for="" propagation="REQUIRES_NEW" read-only="true" isolation="SERIALIZABLE"/>

3、timeout 超时性

timeout: -1 永不超时

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小王java

学习java的路上,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值