Spring提供的事務使用起來很方便,一個@Transactional註解就搞定全部,但是如果不註意,也會踩坑 提到事務就應該想到至少以下幾點: 1、在事務方法中加鎖,可能會導致鎖失效 無論是JVM自帶的鎖,還是分散式鎖,都有可能出現沒鎖住的情況 原因是解鎖先於事務提交,一旦鎖釋放後其它線程就可以獲 ...
Spring提供的事務使用起來很方便,一個@Transactional註解就搞定全部,但是如果不註意,也會踩坑
提到事務就應該想到至少以下幾點:
1、在事務方法中加鎖,可能會導致鎖失效
無論是JVM自帶的鎖,還是分散式鎖,都有可能出現沒鎖住的情況
原因是解鎖先於事務提交,一旦鎖釋放後其它線程就可以獲取到鎖了,由於事務還沒提交,所以新線程讀到的還是舊數據(跟前一個線程讀取到的數據是一樣的),這就相當於多個線程做了一模一樣的事情了。
正確的做法是:要麼別加事務,要麼把鎖加在事務方法外面
2、調用內部(同一個類中)方法的話,事務不會生效
3、事務方法被聲明成private或者final,導致事務不生效
4、聲明回滾的異常類型與拋出的異常不一致,或者異常被吞掉了。
(PS:預設捕獲到RuntimeException和Error類型的異常才會回滾)