下面几个实例数据库初始数据如下图所示
id为 1,2 的数据 content 值都为 111
具体实例
1. REQUIRED传播行为
(1)代码
testTransactional 不抛异常,updateArticle2抛异常
(2)执行代码后数据库数据
(3)分析
REQUIRED处在同一个事务中,一回滚都会回滚
2. REQUIRED_NEW传播行为
(1)代码
代码一:
testTransactional 抛异常,updateArticle2不抛异常
代码二:
testTransactional 不抛异常,updateArticle2抛异常
(2)执行代码后数据库数据
代码一执行后数据库数据:
testTransactional回滚了,updateArticle2未回滚
代码二执行后数据库数据:
testTransactional未回滚,updateArticle2回滚了
(3)分析
REQUIRED_NEW 开启了新事务, 两个事务间相互不影响
3. NESTED
(1)代码
代码一:
testTransactional不抛异常不回滚,updateArticle2中抛异常回滚
代码二:
testTransactional抛出异常回滚,updateArticle2中不抛出异常不回滚
(2)执行代码后数据库数据
代码一执行后数据库数据:
testTransactional 未回滚,updateArticle2回滚了
代码二执行后数据库数据:
testTransactional 回滚,updateArticle2 回滚
(3)分析
NESTED 开启嵌套子事务,子事务回滚不影响父事务,父事务回滚会将子事务也一起回滚掉
总结
| 事务传播行为 | 说明 |
|---|---|
| REQUIRED | 当前没有事务就不开事务,当前存在事务就加入当前事务 |
| REQUIRED_NEW | 开启一个新事务,和原事务不互相影响 |
| NESTED | 如果当前存在事务就开启一个嵌套子事务,子事务回滚不会影响父事务,父事务回滚回将子事务一起回滚掉 |