建設網(wǎng)站 懷疑對方傳銷 網(wǎng)站制作 緩刑在線網(wǎng)頁編輯平臺
目錄
1.什么是Spring 事務
2.Spring 事務的開啟方式
3.Spring事務的實現(xiàn)方式/原理
4.事務傳播機制
5.事務隔離級別
6.事務失效的原因
1.什么是Spring 事務
事務在邏輯上是一組操作,要么執(zhí)行,要不都不執(zhí)行。
如下:
Begin;
insert into student values(1,"test",22,"male");
select * from student;
commit;
上述SQL語句,一般情況是一句一句提交并執(zhí)行;而開啟事務后,上述語句會一起提交并執(zhí)行。
事務操作本來應該由數(shù)據(jù)庫進行控制,但為了方便用戶進行業(yè)務邏輯的拓展,spring對事務功能進行了拓展實現(xiàn)。
所以,Spring 事務其實是數(shù)據(jù)庫事務的拓展而已。其根本上,還是要連接數(shù)據(jù)庫,并開啟數(shù)據(jù)庫事務進行執(zhí)行或者回滾等操作。
2.Spring 事務的開啟方式
Spring支持兩種事務方式,分別是編程式事務(用戶通過代碼來控制事務的處理邏輯)和聲明式事務(通過@Transactional注解實現(xiàn))。一般我們開發(fā)中使用聲明式事務較多。
// 默認是RuntimeException就回滾,傳播機制為REQUIRED@Transactionalpublic boolean transactionTest(UserAccount user) {try {//業(yè)務執(zhí)行邏輯//userDao.insert(user);int i =0; //模擬業(yè)務出錯i = 100 /i;}catch (Exception e){log.error("被除數(shù)為0");//事務回滾TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();return false;}return true;}
//數(shù)據(jù)源@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;//事務@AutowiredTransactionDefinition transactionDefinition;public Boolean execute(){// 手動開啟事務TransactionStatus transactionStatus = null;try {//獲取事務對象transactionStatus =dataSourceTransactionManager.getTransaction(transactionDefinition);// 具體代碼邏輯// 提交事務dataSourceTransactionManager.commit(transactionStatus);} catch (Exception e) {log.error("xxxxxx",e);if (ts != null) {dataSourceTransactionManager.rollback(ts);}throw new RollBackException("業(yè)務出錯了!");}return true;}
上述代碼皆為聲明式事務:代碼段1中使用@Transactional注解開啟,較為便捷;代碼段2則是手動開啟事務,通過TransactionDefinition對象來開啟并提交事務。
3.Spring事務的實現(xiàn)方式/原理
Spring事務是是由AOP來實現(xiàn)的,主要通過TransactionInterceptor類,調(diào)用invoke()方法實現(xiàn)具體邏輯。
首先,當一個方法添加@Transactional后,spring會基于這個類生成一個代理對象。
當使用這個代理對象的方法時,解析方法上事務相關的屬性,判斷是否開啟事務。若開啟,則把關閉自動提交,開啟事務執(zhí)行具體的業(yè)務邏輯。
(invokeWithinTransaction方法中,獲取事務屬性相關代碼,主要判斷事務的類型)
如果執(zhí)行邏輯沒有出現(xiàn)異常,那么代理邏輯會通過cmomitTransactionAfterReturning()完成事務的提交,提交的具體邏輯則是由doCommit()實現(xiàn);
如果出現(xiàn)異常,那么會通過completeTransactionAfterThrowing()進行回滾操作,具體邏輯由doRollBack()實現(xiàn)。同時,用戶也可以控制對哪些異常進行回滾操作。
事務執(zhí)行完畢,會調(diào)用cleanupTransactioninfo()清除相關的事務信息。
(invokeWithinTransaction方法中,聲明式事務的具體執(zhí)行邏輯)
4.事務傳播機制
事物的傳播機制是指不同方法的嵌套調(diào)用過程中,事務如何進行處理,事務之間的相互處理關系。比如說,A類中的a方法要調(diào)用B類中的b方法,是用同一個事務還是兩個事務;出現(xiàn)異常是回滾還是提交。
具體分為7種:以做作業(yè)為例進行解釋
- REQUIRED:默認傳播特性,如果當前沒有事務,則新建事務;如果當前存在事務,則加入事務。(你做作業(yè),我就抄一下;你沒做作業(yè),我就自己做)
- SUPPORTS:當前存在事務,則加入事務;當前沒有事務,則以非事務方式執(zhí)行。(你做作業(yè),我就抄一下,你沒做作業(yè),我也不做)
- MANDATORY:當前存在事務,則加入事務;當前沒有事務,拋出異常。(你做作業(yè),我就抄一下,你沒做作業(yè),警告你)
- REQUIRED_NEW:創(chuàng)建一個新事物,如果當前存在事務,則掛起事務。(不過你有沒有做作業(yè),我都自己做)
- NOT_SUPPORTED: 以非事務方式執(zhí)行, 如果當前存在事務,則掛起事務。(大家都不做作業(yè),如果你做了,我把你作業(yè)撕掉)
- NEVER:不使用事務,如果當前事務存在,拋出異常。
- NESTED:如果當前事務存在,則在嵌套事務(設立保存點,保存父事務的狀態(tài),出現(xiàn)異常時只有子事務會回滾)中執(zhí)行,否則與REQUIRED一致。
?一般開發(fā)中,使用 required、required_new、nested較多。
5.事務隔離級別
Spring 事務中的事務隔離級與數(shù)據(jù)庫的數(shù)據(jù)隔離級別是一致的:
Read uncommitted:讀未提交;read committed讀已提交;repeatable read可重復讀;serializable:串行化。
值得一提的是:如果數(shù)據(jù)庫與spring隔離級別不一致,以spring配置為主。
6.事務失效的原因
一些情況下會導致事務失效,可能的原因如下;
- 1)bean對象沒有被spring容器管理。
- 2)方法的訪問修飾符不是public。
- 3)自身調(diào)用問題。
- 4)數(shù)據(jù)源沒有配置事務管理器。
- 5)數(shù)據(jù)庫不支持事務。
- 6)異常被捕捉。
- 7)異常類型錯誤或者配置錯誤。