-
PROPAGATION_REQUIRED
: 如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟事務(wù); -
PROPAGATION_REQUIRES_NEW
:總是開啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起;
問題:
Spring中一個(gè)沒有事務(wù)的方法A調(diào)用一個(gè)默認(rèn)事務(wù)(PROPAGATION_REQUIRED
)的方法B時(shí),如果使用this調(diào)用方法B,方法B拋出RuntimeException
,此時(shí)方法B事務(wù)未生效,不會(huì)回滾。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Service public class EmployeeService { @Autowired private EmployeeDao employeeDao; public void save(){ try { this .saveEmployee(); //此處this調(diào)用不會(huì)開啟事務(wù),數(shù)據(jù)會(huì)被保存 } catch (Exception e){ e.printStackTrace(); } } @Transactional (propagation = Propagation.PROPAGATION_REQUIRED) //此處無論是PROPAGATION_REQUIRED還是PROPAGATION_REQUIRES_NEW,事務(wù)均不生效 public void saveEmployee(){ Employee employee = new Employee(); employee.setName( "zhangsan" ); employee.setAge( "26" ; employeeDao.save(employee); throw new RuntimeException(); } } |
問題原因:
JDK的動(dòng)態(tài)代理。只有被動(dòng)態(tài)代理直接調(diào)用時(shí)才會(huì)產(chǎn)生事務(wù)。在SpringIoC容器中返回的調(diào)用的對(duì)象是代理對(duì)象而不是真實(shí)的對(duì)象。而這里的this是EmployeeService
真實(shí)對(duì)象而不是代理對(duì)象。
解決辦法:
方法1、在方法A上開啟事務(wù),方法B不用事務(wù)或默認(rèn)事務(wù),并在方法A的catch中throw new RuntimeException();
(在沒指定rollbackFor時(shí),默認(rèn)回滾的異常為RuntimeException
),這樣使用的就是方法A的事務(wù)。(一定要throw new RuntimeException();
否則異常被捕捉處理,同樣不會(huì)回滾。)如下:
1
2
3
4
5
6
7
8
9
|
@Transactional () //開啟事務(wù) public void save(){ try { this .saveEmployee(); //這里this調(diào)用會(huì)使事務(wù)失效,數(shù)據(jù)會(huì)被保存 } catch (Exception e){ e.printStackTrace(); throw new RuntimeException(); } } |
方法2、方法A上可以不開啟事務(wù),方法B上開啟事務(wù),并在方法A中將this調(diào)用改成動(dòng)態(tài)代理調(diào)用(AopContext.currentProxy()
),如下:
1
2
3
4
5
6
7
8
|
public void save(){ try { EmployeeService proxy =(EmployeeService) AopContext.currentProxy(); proxy.saveEmployee(); } catch (Exception e){ e.printStackTrace(); } } |
到此這篇關(guān)于spring事務(wù)調(diào)用失效問題的文章就介紹到這了,更多相關(guān)spring事務(wù)調(diào)用失效問題內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_33976072/article/details/88113917