spring的service不启动事务的配置。
為什么80%的碼農都做不了架構師?>>> ??
原來是這樣設置的:
?? ? ? ?<tx:attributes>
?? ? ? ? ? ?<tx:method name="*" read-only="true"/>
?? ? ? ?</tx:attributes>
發現selectA調用selectB,如果selectB拋出Exception,selectA中捕獲Exception但是并不繼續向外拋出,最后會出現錯誤。
?
Transaction rolled back because it has been marked as rollback-only
糾其原理其實很簡單,在selectB返回的時候,transaction被設置為rollback-only了,但是selectA正常消化掉,沒有繼續向外拋。
那么selectA結束的時候,transaction會執commit操作,但是transaction已經被設置為rollback-only了。
所以會出現這個錯誤。
有的同學說了,那不是沒得搞了,service不能拋出異常,或者不能攔截異常了?
其實不然,其實錯誤不在這里,而是select這種操作為什么要啟動事務呢?
調整好問題,找解決方案,問題就出現在propagation="REQUIRED"這個屬性上。
標準文檔上這樣寫:
| MANDATORY? ??????????Support a current transaction, throw an exception if none exists. | 
| NESTED? ??????????Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. | 
| NEVER? ??????????Execute non-transactionally, throw an exception if a transaction exists. | 
| NOT_SUPPORTED? ??????????Execute non-transactionally, suspend the current transaction if one exists. | 
| REQUIRED? ??????????Support a current transaction, create a new one if none exists. | 
| REQUIRES_NEW? ??????????Create a new transaction, suspend the current transaction if one exists. | 
| SUPPORTS? ??????????Support a current transaction, execute non-transactionally if none exists. | 
?
看來我們需要如下修改:
?? ? ? ?<tx:attributes>
?? ? ? ? ? ?<tx:method name="*" read-only="true" propagation="NOT_SUPPORTED"/>
?? ? ? ?</tx:attributes>
這樣select這樣的檢索操作根本就不啟動事務了,而且在有事務的方法中也是可以正常調用select方法的。
現在就沒問題了。
但是現在出現了另外一個問題,就是,如果在一個事物內對db進行操作,然后在出事物之前對剛才db操作的數據進行select是獲取不到修改結果的,為什么呢?因為not——supported是會在執行select之前掛起原有事物,不在原有事物內,當然無法獲得修改后的數據。
怎么辦?改成supports:
?? ? ? ?<tx:attributes>
?? ? ? ? ? ?<tx:method name="*" read-only="true" propagation="SUPPORTS"/>
?? ? ? ?</tx:attributes>
這個狀態用一句話概括就是“有則加入事物,無也不創建事物”。
轉載于:https://my.oschina.net/jing31/blog/10414
總結
以上是生活随笔為你收集整理的spring的service不启动事务的配置。的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: currentTitle的用法
- 下一篇: css 水平垂直居中那些事
