引用 大家在使用spring的注解式事務管理時,,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。
事物注解方式: @Transactional 當標于類前時, 標示類中所有方法都進行事物處理 例子: @Transactional public class TestServiceBean implements TestService {} 當類中某些方法不需要事物時: @Transactional public class TestServiceBean implements TestService { private TestDao dao; public void setDao(TestDao dao) { this.dao = dao; } @Transactional(propagation = Propagation.NOT_SUPPORTED) public List<Object> getAll() { return null; } } 事物傳播行為介紹: @Transactional(propagation=Propagation.REQUIRED) 如果有事務, 那么加入事務, 沒有的話新建一個(默認情況下) @Transactional(propagation=Propagation.NOT_SUPPORTED) 容器不為這個方法開啟事務 @Transactional(propagation=Propagation.REQUIRES_NEW) 不管是否存在事務,都創(chuàng)建一個新的事務,原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務 @Transactional(propagation=Propagation.MANDATORY) 必須在一個已有的事務中執(zhí)行,否則拋出異常 @Transactional(propagation=Propagation.NEVER) 必須在一個沒有的事務中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反) @Transactional(propagation=Propagation.SUPPORTS) 如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務. 事物超時設置: @Transactional(timeout=30) //默認是30秒 事務隔離級別: @Transactional(isolation = Isolation.READ_UNCOMMITTED) 讀取未提交數(shù)據(jù)(會出現(xiàn)臟讀, 不可重復讀) 基本不使用 @Transactional(isolation = Isolation.READ_COMMITTED) 讀取已提交數(shù)據(jù)(會出現(xiàn)不可重復讀和幻讀) @Transactional(isolation = Isolation.REPEATABLE_READ) 可重復讀(會出現(xiàn)幻讀) @Transactional(isolation = Isolation.SERIALIZABLE) 串行化 @Transactional(propagation=Propagation.NESTED) @Transactional (propagation = Propagation.REQUIRED,readOnly=true) //readOnly=true只讀,不能更新,刪除 @Transactional (propagation = Propagation.REQUIRED,timeout=30)//設置超時時間 @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)//設置數(shù)據(jù)庫隔離級別 @Transactional(noRollbackFor=Exception.class)//指定不回滾,遇到運行期例外 @Transactional(rollbackFor=Exception.class) //指定回滾,需要捕獲的例外 MYSQL: 默認為REPEATABLE_READ級別 SQLSERVER: 默認為READ_COMMITTED 臟讀 : 一個事務讀取到另一事務未提交的更新數(shù)據(jù) 不可重復讀 : 在同一事務中, 多次讀取同一數(shù)據(jù)返回的結果有所不同, 換句話說, 后續(xù)讀取可以讀到另一事務已提交的更新數(shù)據(jù). 相反, "可重復讀"在同一事務中多次 讀取數(shù)據(jù)時, 能夠保證所讀數(shù)據(jù)一樣, 也就是后續(xù)讀取不能讀到另一事務已提交的更新數(shù)據(jù) 幻讀 : 一個事務讀到另一個事務已提交的insert數(shù)據(jù) |
|
來自: Java技術館 > 《Spring注解事務》