https://blog.csdn.net/catoop/article/details/53482960
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/53482960 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<div id="content_views" class="markdown_views">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p>小经验: <br>
同一个业务类里面 , 即使声明为 Propagation.REQUIRES_NEW也不会新启一个事务。必须调用另一个类的Propagation.REQUIRES_NEW方法才行。
如下代码:
@Service
public class A {
@Autowired
private OrderApplyMapper orderApplyMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public int testB(OrderApply order) {
return orderApplyMapper.save(order);
}
@Transactional
public void testA(OrderApply order) {
System.out.println("1111111111111");
testB(order);
System.out.println("2222222222222");
throw new RuntimeException();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
这2个方法在同一个类中,本身预期结果是testB方法执行成功,testA方法回滚。实际结果是testB也会被回滚。
如果想使 Propagation.REQUIRES_NEW 生效,则需要把testB这个方法单独放到别的类中,然后调用过来。
具体为什么会这样,没有深究,写下来记录一下。