javascript
Spring嵌套事务控制
A類 ? callBack_test()
B類 ? testadd()
C類 ? select(),得查詢到B類testadd方法中新增的數(shù)據(jù)。以及初始化一些屬性
場(chǎng)景:A類 嵌套 B類? B類嵌套C類;都是由spring控制事務(wù)。
要求:B類testadd方法中不受spring事務(wù)控制,單獨(dú)新開(kāi)個(gè)事務(wù)運(yùn)行,可以使C類查詢的到。
問(wèn)題:A類是系統(tǒng)底層方法,必須受事務(wù)控制。且C類必須查詢到剛剛add的數(shù)據(jù)。
分析:初步分析為:Spring事務(wù)傳播性導(dǎo)致的,從A類開(kāi)啟的事務(wù),就有完結(jié)。為了避免這樣的情況。最好將相關(guān)類。不要讓spring控制事務(wù)。
解決:B類中testadd()方法顯示開(kāi)啟事務(wù)。方法例如以下:
? //testadd方法中數(shù)據(jù)不受事務(wù)控制(要求:是否下發(fā)成功。不影響興許代碼運(yùn)行;因此要開(kāi)啟一個(gè)新事務(wù))
? //開(kāi)啟新事務(wù),防止跟其它事務(wù)混淆
? DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextFactory
? .getBean("transactionManager");
? DefaultTransactionDefinition def = new DefaultTransactionDefinition();?
? def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔離級(jí)別,開(kāi)啟新事務(wù),與A類和B類不使用同一個(gè)事務(wù)。
? TransactionStatus status = transactionManager.getTransaction(def); //獲得事務(wù)狀態(tài)
try{
???? **************代碼邏輯****************
??? transactionManager.commit(status);
? }catch (Exception e) {
?? // TODO: handle exception
?? transactionManager.rollback(status);
? }
?
補(bǔ)充:
將B類中testadd方法配置成不讓spring事務(wù)控制,testadd方法顯示開(kāi)啟事務(wù)。手動(dòng)提交。
嘗試:
將B類的testadd方法增加spring事務(wù)控制中,且配置事務(wù)級(jí)別為PROPAGATION_REQUIRES_NEW,
不起作用,原因是直接把當(dāng)前事務(wù)給掛起了
- PROPAGATION_REQUIRED:假設(shè)當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù),假設(shè)已經(jīng)存在一個(gè)事務(wù),就增加到這個(gè)事務(wù)中。
這是最常見(jiàn)的選擇。
- PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),假設(shè)當(dāng)前沒(méi)有事務(wù)。就以非事務(wù)方式運(yùn)行。
- PROPAGATION_MANDATORY:使用當(dāng)前的事務(wù),假設(shè)當(dāng)前沒(méi)有事務(wù),就拋出異常。
- PROPAGATION_REQUIRES_NEW:新建事務(wù),假設(shè)當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
- PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行操作,假設(shè)當(dāng)前存在事務(wù)。就把當(dāng)前事務(wù)掛起。
- PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行。假設(shè)當(dāng)前存在事務(wù)。則拋出異常。
- PROPAGATION_NESTED:假設(shè)當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)運(yùn)行。假設(shè)當(dāng)前沒(méi)有事務(wù),則運(yùn)行與PROPAGATION_REQUIRED類似的操作
2. 備注:
?? 疑問(wèn):怎樣手動(dòng)提交spring管理的事務(wù)?注:spring事務(wù)級(jí)別是PROPAGATION_REQUIRED
? 答案:首先在類開(kāi)始部分。開(kāi)啟一個(gè)事務(wù),事務(wù)的隔離級(jí)別假設(shè)是PROPAGATION_REQUIRED。手動(dòng)提交事務(wù)不起作用。
???????????? 事務(wù)的隔離級(jí)別須要配置成.PROPAGATION_REQUIRES_NEW。手動(dòng)提交事務(wù)才干起作用。
//開(kāi)啟新事務(wù),防止跟其它事務(wù)混淆
? DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextFactory
? .getBean("transactionManager");
? DefaultTransactionDefinition def = new DefaultTransactionDefinition();?
? def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔離級(jí)別,開(kāi)啟新事務(wù),與A類和B類不使用同一個(gè)事務(wù)。
? TransactionStatus status = transactionManager.getTransaction(def); //獲得事務(wù)狀態(tài)
參考引用:http://blog.csdn.net/ziyunlong1984/article/details/7725585
http://blog.chinaunix.net/uid-10289334-id-2964925.html
http://blog.csdn.net/hy6688_/article/details/44763869
轉(zhuǎn)載于:https://www.cnblogs.com/lxjshuju/p/6914417.html
總結(jié)
以上是生活随笔為你收集整理的Spring嵌套事务控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《数据结构与算法分析—Java语言描述》
- 下一篇: javascript 中的各种width