Spring中Transactional配置
(2011-05-12 18:56:32) 轉(zhuǎn)載 標(biāo)簽: 雜談 分類(lèi): spring @Transactional(noRollbackFor=RuntimeException.class)方法事務(wù)說(shuō)明 @Transactional(RollbackFor=Exception.class) @Transactional(readOnly=true) @Transactional(timeout=100) @Transactional(isolation)數(shù)據(jù)庫(kù)的隔離級(jí)別 { Read Uncommited:讀取未提交的數(shù)據(jù)(會(huì)出現(xiàn)臟讀不可重復(fù)讀 幻讀) Read Commited:讀已提交的數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀) Repeatable Read:可重復(fù)讀(會(huì)出現(xiàn)幻讀) Serializable:串行化 } 臟讀:一個(gè)事務(wù)讀取到另外一個(gè)事務(wù)未提交的更新的數(shù)據(jù) 不可重復(fù)讀:在同一事務(wù)中,多次讀取同一個(gè)數(shù)據(jù)返回結(jié)果有所不同,,就是后續(xù)的讀取可以讀到另外一個(gè)事務(wù)的已經(jīng)的已經(jīng)提交的更新數(shù)據(jù) 可重復(fù)讀:在同一個(gè)事務(wù)多次讀取數(shù)據(jù)時(shí),,能夠保證所讀取的數(shù)據(jù)一樣,也就是后讀取的不能讀到另外一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù) 幻讀:一個(gè)事務(wù)讀取到另外一個(gè)事務(wù)已經(jīng)提交的更新的數(shù)據(jù) 針對(duì)查詢(xún)方法 @Transactional(propagation=Propagation.NOT_SUPPORTED)針對(duì)某個(gè)方法不開(kāi)啟事務(wù) @Transactional(propagation=Propagation.REQUIRED)默認(rèn)的事務(wù)支持 例子: public class Bean1 { @Transactional(propagation=Propagation.Required) public void update() { executeUpdate(SQL); } } public class Bean2 { @Transactional(propagation=Propagation.SUPPORTS) public void update() { executeUpdate(SQL); } } public class Transaction { @Transactional(propagation=Propagation.REQUIRES_NEW) public void test1() { bean1.update(); bean2.update(); } @Transactional(propagation=Propagation.NOT_SUPPORTED) public void test2() { bean1.update(); bean2.update(); } @Transactional(propagation=Propagation.SUPPORTS) public void test3() { bean1.update(); bean2.update(); } } //事務(wù)傳播屬性 @Transactional(propagation=Propagation.REQUIRED)//如果有事務(wù),,那么加入事務(wù),,沒(méi)有的話(huà)新創(chuàng)建一個(gè) @Transactional(propagation=Propagation.NOT_SUPPORTED)//這個(gè)方法不開(kāi)啟事務(wù) @Transactional(propagation=Propagation.REQUIREDS_NEW)//不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),,原來(lái)的掛起,,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù) @Transactional(propagation=Propagation.MANDATORY)//必須在一個(gè)已有的事務(wù)中執(zhí)行,,否則拋出異常 @Transactional(propagation=Propagation.NEVER)//不能在一個(gè)事務(wù)中執(zhí)行,,就是當(dāng)前必須沒(méi)有事務(wù),否則拋出異常 @Transactional(propagation=Propagation.SUPPORTS)//其他bean調(diào)用這個(gè)方法,如果在其他bean中聲明了事務(wù),,就是用事務(wù),。沒(méi)有聲明,就不用事務(wù),。 @Transactional(propagation=Propagation.NESTED)//如果一個(gè)活動(dòng)的事務(wù)存在,,則運(yùn)行在一個(gè)嵌套的事務(wù)中,如果沒(méi)有活動(dòng)的事務(wù),,則按照REQUIRED屬性執(zhí)行,,它使用一個(gè)單獨(dú)的事務(wù)。這個(gè)書(shū)屋擁有多個(gè)回滾的保存點(diǎn),,內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響,,它只對(duì)DataSource TransactionManager事務(wù)管理器起效。 @Transactional(propagation=Propagation.REQUIRED,readOnly=true)//只讀,,不能更新,,刪除 @Transactional(propagation=Propagation.REQUIRED,timeout=30)//超時(shí)30秒 @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)//數(shù)據(jù)庫(kù)隔離級(jí)別 參考資料有: http://www.cnblogs.com/xupei/archive/2011/01/07/1929632.html http://hi.baidu.com/qmzwhl/blog/item/aae2d6581afd17d29d8204ca.html spring 事務(wù)注解 默認(rèn)遇到throw new RuntimeException("...");會(huì)回滾 需要捕獲的throw new Exception("...");不會(huì)回滾 // 指定回滾 @Transactional(rollbackFor=Exception.class) public void methodName() { // 不會(huì)回滾 throw new Exception("..."); } //指定不回滾 @Transactional(noRollbackFor=Exception.class) public ItimDaoImpl getItemDaoImpl() { // 會(huì)回滾 throw new RuntimeException("注釋"); } // 如果有事務(wù),那么加入事務(wù),沒(méi)有的話(huà)新建一個(gè)(不寫(xiě)的情況下) @Transactional(propagation=Propagation.REQUIRED) // 容器不為這個(gè)方法開(kāi)啟事務(wù) @Transactional(propagation=Propagation.NOT_SUPPORTED) // 不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來(lái)的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù) @Transactional(propagation=Propagation.REQUIRES_NEW) // 必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常 @Transactional(propagation=Propagation.MANDATORY) // 必須在一個(gè)沒(méi)有的事務(wù)中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反) @Transactional(propagation=Propagation.NEVER) // 如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒(méi)有聲明事務(wù),那就不用事務(wù). @Transactional(propagation=Propagation.SUPPORTS) /* public void methodName(){ // 本類(lèi)的修改方法 1 update(); // 調(diào)用其他類(lèi)的修改方法 otherBean.update(); // 本類(lèi)的修改方法 2 update(); } other失敗了不會(huì)影響 本類(lèi)的修改提交成功 本類(lèi)update的失敗,other也失敗 */ @Transactional(propagation=Propagation.NESTED) // readOnly=true只讀,不能更新,刪除 @Transactional (propagation = Propagation.REQUIRED,readOnly=true) // 設(shè)置超時(shí)時(shí)間 @Transactional (propagation = Propagation.REQUIRED,timeout=30) // 設(shè)置數(shù)據(jù)庫(kù)隔離級(jí)別 @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT) |
|