问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

拿下Spring 事务

发布网友 发布时间:2023-07-17 05:13

我来回答

1个回答

热心网友 时间:2024-12-04 16:19

事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,要么都失败。是一个不可分割的工作单元。

事务具有 4 个特性:原子性、一致性、隔离性】持久性,简称为 ACID 特性。

举例:银行转账。小明给小红转 100 元。小明需要减少余额 100,小红需要增加余额 100。这是两个操作,需要一起成功。如果在小明转账成功之后发生了异常,就会出现小明 减 100 余额,但是小红并没有加 100 余额。就会造成钱丢失的情况。这是绝对不允许的。伪代码如下:

Spring 支持 2 种事务管理方式。

Spring 并不会直接管理事务,而是通过事务管理器对事务进行管理的。

Spring 提供了一个 PlatformTransactionManager 接口,这个接口被称为 Spring 的事务管理器,其源码如下:

该接口的源码很简单。这个接口针对不同的框架提供了不同的实现类,如下:

注意:这些实现类,需要导入对应的依赖才能看到。该接口中还有两个对象,分别是 TransactionDefinition 和 TransactionStatus。

方法说明如下:

方法说明如下:

方法说明如下:

有一个默认的抽象实现 AbstractTransactionStatus ,对 TransactionExecution、savepoint、SavepointManager 有具体的实现逻辑,代码有点多,就不贴了,但是非常好理解。 对 TransactionExecution、savepoint、SavepointManager 有具体的实现逻辑,代码有点多,就不贴了,但是非常好理解。 DefaultTransactionStatus 又继承了 AbstractTransactionStatus,继续进行扩充。

事务传播行为指的是,多事务方法之间进行调用时,这个过程中事务应该如何进行管理。例如,事务方法 A 在调用事务方法 B 时,B 方法是在调用者 A 方法的事务中运行呢,还是为自己开启一个新事务运行,这就是由事务方法 B 的事务传播行为决定的。

事务方法:能让数据库表数据发生改变的方法,例如新增、删除、修改数据的方法。

根据上面的描述,我们可以将行为分为三大类。

事务有一个特性为隔离性,多事务操作之间不会产生影响。但如果不考虑隔离性,则会产生三个读问题:脏读、不可重复读、虚(幻)读。

我们先来看看不使用事务会发生什么情况。创建名为 aopxml 的包。

在类中提供两个方法,一个张三增加金额,一个李四减金额。

项目结构如下:

控制台出现异常

再来查看数据库数据,可以发现张三的金额增加了,但是李四的金额没有减。银行哭死!!! 所以我们需要引入 Spring 事务,解决上述出现的问题。

配置的事务管理器实现为 DataSourceTransactionManager,是 JDBC 和 MBatis 的PlatformTransactionManager 接口实现。

配置事务通知,指定所需要使用的事务管理器以及指定事务作用的方法和该事务属性。

transaction-manage 参数的默认值就是 transactionManager,如果事务管理器 id 与其一致,则可以不用指定。 元素包含多个属性参数,可以为某个或某些方法(name 属性指定的方法)定义事务属性,如下表所示:

如上写法就对 transfer 方法进行了事务管理。就不会出现小明减少余额,而小红没有增加余额的情况,发生了异常就进行回滚。

使用注解方式就不会有上面如此琐碎的配置了。再重新创建名为 txannon 包,将 xml 方式使用到的 entity、、service 相关代码 copy 过来。

使用 EnableTransactionManagement 注解开启事务。

相当于tx:annotation-driven 标签。

可以不需要在配置切入点和切面了。

在需要添加事务的方法上添加 @Transactional 注解,表明该方法需要进行事务管理。

@Transactional 这个注解可以添加到类上面,也可以添加方法上面。如果把这个注解添加到类上面,这个类里面所有的方法都添加事务,如果把这个注解添加方法上面,则是为这个方法添加事务。

Transactional 这个注解里面可以配置很多事务相关参数。

基本用法会了,现在就来看看事务的传播行为,这是Spring事务中难以理解的一块,因为它的场景很多。

如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行

当前方法必须启动新事务,并在它自己的事务内运行。如果有事务正在运行,应该将它挂起。

rece 方法行为修改为 Propagation.REQUIRES_NEW 。transfer 方法创建新事务,然后调用 rece 方法,rece 方法会将 transfer 方法的事务挂起,并创建属于 rece 方法的事务。所以在该例子中会创建两个事务。由于有两个事务,那事务的回滚就出现了几种情况。

transfer 方法进行的操作不会回滚,rece 方法的操作会回滚。

如果当前存在事务(主事务),则创建一个新事务作为当前事务的嵌套事务(子事务)来运行;如果当前没有事务,则该取值等价于 REQUIRED。

transfer 方法发生异常并回滚,会导致 rece 方法 同时回滚。

transfer 方法进行的操作不会回滚,rece 方法的操作会回滚。 注意 :transfer 方法需要进行 catch,不然 transfer 方法也会回滚。

主事务方法异常回滚时,会同时回滚子事务。而子事务可以单独异常回滚,可以不影响主事务和其他子事务(前提是需要处理掉子事务的异常)

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

由于 transfer 方法没有事务,在启动时就会抛出异常,如下:

如果有事务在运行,当前的方法就在这个事务内运行;如果当前没有事务,则以非事务的方式运行。

由于 transfer 方法没有事务,所以 rece 方法也不会创建事务,发生了异常也不会进行回滚。

以非事务方式运行,如果当前存在事务,则把当前事务挂起。

transfer 方法有事务,但 rece 方法传播行为是 NOT_SUPPORTED,所以会将 transfer 方法事务挂起,rece 方法以非事务的方式运行。

所以图片例子会出现 transfer 方法进行的操作会回滚,rece 方法的操作不会回滚。

以非事务方式运行,如果当前存在事务,则抛出异常。

由于 transfer 方法有事务,在启动时就会抛出异常,如下:

上面一直在说遇到异常就回滚,那是遇到所有异常都会回滚吗?不是的,默认情况下,Spring 事务只有遇到 RuntimeException 以及 Error 时才会回滚,在遇到检查型异常时是不会回滚的,比如 IOException、TimeoutException。

那如果想在发生检查型异常时也进行回滚呢,可以使用 rollbackFor 属性进行如下配置:

那同理,如果遇到某个异常,不想进行回滚,使用 noRollbackFor 属性配置如下:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水利水电工程单元工程施工质量验收评定标准——土石方工程(SL 631... 关于水利水电工程项目划分的规程有哪些?划分的越细越好,感谢大家的帮 ... 水利水电工程的单位工程包括哪些工程? 尖子生学案:生物高中选修3目录 U盘传了数据怎么删除电脑记录如何清除电脑上U盘使用记录 把u盘插电脑怎么删掉记忆如何删掉电脑上插过U盘的记录 win7清除u盘记录 如何清理win7电脑u盘痕迹如何清除电脑上U盘使用记录 麦当劳和华莱士的外卖电话是什么? 一文详解ISO/IEC20000信息技术服务管理体系认证好处、材料、流程 石首市华彩国际影城大年30开不开门 相思春风轻轻吹是哪首歌的歌 梅菜肉酱焖红豆角怎么做 如何预防青少年抑郁症的发生? 伊万里胡桃最后恢复正常了么 未婚女性经常痛经 未婚女性痛经如何饮食调理 女孩23岁未婚,痛经,经诊断为子宫腺肌症,怎么治疗 请问80台计算机房有哪些设备,需要多少兆? 政府办公楼布线设计? 滴水观音如何养(滴水观音养护与注意事项) 已经装了IE7.0如何卸载然后安装IE6.0? 急求!!!装了IE7.0之后怎么又能换回IE6.0啊? 索尼“rx100”和“m12345”的区别是什么? Sony 索尼 DSC-RX100 ™数码相机有什么优缺点? 您好。请问SONYRX100、RX10、RX1这三个系列区别和各自优缺点是什么... 索尼是什么意思? SONYRX100、RX10、RX1这三个系列区别和各自优缺点是什么?_百度... 到底什么是麻将精神呢? 湖南省2022年度4月成人电大中专最新招生专业 华彩同乐迪开门了吗 上海秋季水果集中上市,火葫芦柿子热销,这对果农来说是好是坏? 我在spring设置了事务管理,但是对于需要使用事务的方法,如果不手动开 ... 总结一下宋江上山的经历(200字左右) 朱贵水亭施号箭 林冲雪夜上梁山读书笔记200字一到五回 佳木斯人民银行地址 犊鼻与解溪的距离是16寸吗 郝敬江的分管工作 《针刺犊鼻与上下内外四关穴》 黑龙江佳木斯万达附近有中国人民银行吗 定西到成都多少公里 DNF70版本刷图奶爸是堆智力还是魔攻? DNF70版本审判流奶爸还要加体力和精神吗 延长到定边多少公里 如何输入波浪号“~”? 男人说我不能让你没面子哈怎么回复? 王者荣耀怎么免费领取皮肤 一个新二胡开音的问题,请教老师! 当别人请吃饭问给不给面子的时候 我该怎么回答才好 二胡音质