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