1、事務的實現思想
在spring中要想某個方法具有事務,只要在方法前加一個@Transactional注解。然后spring就會利用aop思想,在這個方法執行前開啟事務,
在方法執行后選擇提交事務或者回滾事務。
2、7種事務傳播機制
1 @Transactional(propagation = Propagation.REQUIRED) 2 public void A(){ 3 //doSomething
B();
//doSomething
4 } 5 6 @Transactional(propagation = ?) 7 public void B(){ 8 //doSomething 9 }
1、REQUIRED:
spring默認事務,如果當前沒有事務就創建一個事務,如果當前有事務就當入該事務。如果此時B設置為REQUIRED,A調用B后B中的代碼會加入A中的事務,一起回滾或提交。
2、SUPPORTS:
有事務就按有事務執行,沒有事務就以非事務方式執行。如果此時B設置為SUPPORTS,單獨調用B會以非事務的方式執行,A調用B是,B中的代碼會加入A中的事務。
3、MANDATORY:
必須要有事務,如果沒有事務就會報錯。如果B設置為MANDATORY,單獨調用B會報錯,A調用B時,B中的代碼會加入A中的事務,一起回滾或提交。
4:REQUIRES_NEW:
不管有沒有事務都會創建一個新的事務。如果B設置為REQUIRES_NEW,單獨調用B會創建事務,A調用B時,B也會創建一個新事務t2,A事務t1和t2互不影響,各自提交回滾自己的事務。
5、NOT_SUPPORTED:
不支持事務,如果有事務就會把事務掛起。如果B設置為NOT_SUPPORTED,單獨調用B沒有事務,A調用B時,運行到B中代碼時,會把事務掛去。
6、NEVER:
不支持事務,如果有事務就會報錯。如果B設置為NEVER,單獨調用B沒有事務,A調用B時會報錯。
7、NESTED:
嵌套事務,當前有事務時就嵌套執行事務,當前沒有事務時就按REQUIRED屬性執行。如果B設置為NESTED,單獨調用B會創建一個事務。A調用B時,B會創建一個回滾點,B中代碼
拋出異常時會回滾到這個回滾點,A中的代碼可以繼續往下執行,但是A中代碼出異常后會連帶着B一起回滾。