1.spring事務超時transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException;
?可能原因1:spring事務設置的時間比較短。
?解決方法:把spring事務設置長一點,如果事務中有很多復雜的查詢及更新操作,取消方法上的事務注解,然后把查詢操作整理后放在方法最前面,把更新操作放在一塊,用自定義事務把更新操作放進去。
?可能原因2:可能是mysql數據庫InnoDB使用緩沖池設置小了,事務隔離級別不對。
?解決方法:把緩存mysql數據庫InnoDB使用緩沖池設置大些,同時把事務隔離級別由默認的REPEATABLE_READ級別改為READ_COMMITTED(關于事務級別在這里不再描述);
?可能原因3:查詢、更新sql效率不高;
?解決方法:加索引,注意根據不同的數據庫編寫不同的表及where條件順序。
2.spring事務(Transaction )報 marked as rollback-only異常的原因及解決方法
?在spring中,在事務方法中調用多個事務方法時,spring將會把這些事務合二為一。
?當整個方法中每個子方法沒報錯時,整個方法執行完才提交事務(大家可以使用debug測試),
?如果某個子方法有異常,spring將該事務標志為rollback only。如果這個子方法沒有將異常往上整個方法拋出或整個方法未往上拋出,
?那么改異常就不會觸發事務進行回滾,事務就會在整個方法執行完后就會提交,
?這時就會造成Transaction rolled back because it has been marked as rollback-only的異常;
如果沒看懂可以看[《 spring事務(Transaction )報 marked as rollback-only異常的原因及解決方法》](http://blog.csdn.net/mr_smile2014/article/details/49455483)這篇文章
3.已經定義事務了,為什么事務不回滾。
?
檢查自己的代碼中是不是用try...catch把異常獲取了,而沒有往上拋。如果沒有往上拋,事務就會以為一切都很順利沒有出錯,最后就會提交事務。如下面的代碼,出現異常就不會回滾:
~~~
@Transactional(rollbackFor = { Exception.class }) ?
public void test() { ?
? try { ?
? ? ?doDbStuff1(); ?
? ? ? doDbStuff2();//假如這個操作數據庫的方法會拋出異常,現在方法doDbStuff1()對數據庫的操作 ?不會回滾。 ?
? } catch (Exception e) { ?
? ? ? ? ?e.printStackTrace(); ? ??
? } ?
}
~~~
我們把上面的代碼改成下面的代碼,出現異常就會回滾:
~~~
@Transactional(rollbackFor = { Exception.class }) ?
public void test() { ?
? try { ?
? ? ?doDbStuff1(); ?
? ? ? doDbStuff2();//假如這個操作數據庫的方法會拋出異常,現在方法doDbStuff1()對數據庫的操作 ?不會回滾。 ?
? } catch (Exception e) { ?
? ? ? ? ?e.printStackTrace(); ??
throw e; ?
? } ?
}
~~~
4.Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined;
原因是沒有找到對應的bean,檢查spring的版本是否正確;
- 前言
- spring事務(Transaction )報 marked as rollback-only異常的原因及解決方法
- 自己整理的編碼規范總結。(個人覺得很受用)
- spring事務常見問題、異常分析和解決方法
- 剖析OutOfMemoryError: PermGen space產生原因及解決方法
- 剖析java.lang.OutOfMemoryError: Java heap space產生原因及解決方法
- java中不同的ORM框架實現對數據庫批量插入數據庫的方式與技巧
- 解決java讀取大文件內存溢出問題、如何在不重復讀取與不耗盡內存的情況下處理大文件
- 不得不看的Java代碼性能優化總結
- 實現使用3des在頁面js加密,后臺java解密
- Java日志記錄的5條規則