通过几个实例理解 Spring 事务传播行为

44 阅读1分钟

下面几个实例数据库初始数据如下图所示 image.png id为 1,2 的数据 content 值都为 111

具体实例

1. REQUIRED传播行为

(1)代码

image.png testTransactional 不抛异常,updateArticle2抛异常

(2)执行代码后数据库数据

image.png

(3)分析

REQUIRED处在同一个事务中,一回滚都会回滚

2. REQUIRED_NEW传播行为

(1)代码

代码一: image.png testTransactional 抛异常,updateArticle2不抛异常 代码二: image.png testTransactional 不抛异常,updateArticle2抛异常

(2)执行代码后数据库数据

代码一执行后数据库数据: image.png testTransactional回滚了,updateArticle2未回滚 代码二执行后数据库数据: image.png testTransactional未回滚,updateArticle2回滚了

(3)分析

REQUIRED_NEW 开启了新事务, 两个事务间相互不影响

3. NESTED

(1)代码

代码一: image.png testTransactional不抛异常不回滚,updateArticle2中抛异常回滚 代码二: image.png testTransactional抛出异常回滚,updateArticle2中不抛出异常不回滚

(2)执行代码后数据库数据

代码一执行后数据库数据: image.png testTransactional 未回滚,updateArticle2回滚了 代码二执行后数据库数据: image.png testTransactional 回滚,updateArticle2 回滚

(3)分析

NESTED 开启嵌套子事务,子事务回滚不影响父事务,父事务回滚会将子事务也一起回滚掉

总结

事务传播行为说明
REQUIRED当前没有事务就不开事务,当前存在事务就加入当前事务
REQUIRED_NEW开启一个新事务,和原事务不互相影响
NESTED如果当前存在事务就开启一个嵌套子事务,子事务回滚不会影响父事务,父事务回滚回将子事务一起回滚掉