文章目录
问题现象
1 | org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly |
代码示例-事务嵌套
1 |
|
问题分析:
如上代码段,由于事务的传播性,doA,doB,doC方法其实共用的是由doA开启的同一个事务对象。
当doB方法抛出异常后事务被标记为回滚状态,再尝试执行doC方法或者执行任何的更改方法,在进行数据更新后进行事务commit时,此时则为抛出以上的异常。
解决方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public class ClassA {
private ClassB classB;
//@Transaction
public void doA() {
try {
classB.doB();
} catch(Exception e) {
classB.doC();
}
}
}
public class ClassB {
public void doB() {
if(1==1) {
throw new Exception("模拟异常");
}
}
public void doC() {
//有数据更改动作
}
}
以上的解决方法去掉了doA的事务,交由doB与doC分别开启两个事务解决,当doB失败时只标记doB的事务回滚,doC的事务依然能进行提交。
观点仅代表自己,期待你的留言。