javascript
Spring框架-事务管理注意事项
轉載自?Spring框架-事務管理注意事項
常見事務問題
事務不起作用
-
可能是配置不起效,如掃描問題
事務自動提交了(批量操作中)
-
可能是在沒事務的情況下,利用了數據庫的隱式提交
事務配置說明
通常情況下我們的Spring Component掃描分為兩部分,一部分是Spring Servlet(MVC),一部分是其他Context Config的內容。主要掃描Annotation定義,包括@Controller、@Autowired、@Resource、@Service、@Component、@Repository等。
Spring Servlet部分的掃描配置可以通過web.xml中DispatchServlet的init-param節點配置確定。
Context Config部分的掃描配置為非以上配置的其他Spring配置文件確定。
為了能夠使用事務,需要防止因Spring Servlet的掃描導致@Service事務配置失效。可以調整DispatchServlet中的配置文件,排除對@Service的掃描。
配置如下:
<context:component-scan base-package="com.jiuyescm.xxx"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>如何通過日志判斷事務是否已經被Spring所管理?
在logback或者log4j中對org.springframework.aop、org.springframework.transaction、org.springframework.jdbc、org.mybatis.spring.transaction進行DEBUG級別日志跟蹤(開發期)
查看日志中是否有事務管理、開啟、提交、回滾等字符,如:
DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@28cfe912] will be managed by Spring沒有被控制的時候,日志如下:
DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@28cfe912] will not be managed by Spring如何通過程序判斷是否存在事務?
boolean flag = TransactionSynchronizationManager.isActualTransactionActive();返回true,則在事務控制下,否則不在控制下
什么時候做了隱式提交?
在沒有容器事務的情況下,系統會嘗試隱時提交。
開發建議:
所有Service代碼中設置Class級別的@Transactional,并設置為只讀,開發時可以很容易發現誤數據庫操作的動作。如:@Transactional(readOnly=true)。
所有Service代碼中Public的方法設置@Transactional,并根據實際情況設置Propagation,可以設置為REQUIRED。
對于有異常產生可能的情況下,根據情況選擇合適的rollbackFor,默認情況下可以設置對Exception.class或BizException.class進行控制。
盡可能減少嵌套的使用方法(Service call Service),采用傳統的Controller-》Service-》Repository(DAO)的模型。
如果需要深入了解Transaction的流程,請自行翻閱和跟蹤Spring和Mybatis相關代碼。
以下是嵌套事務的各種情況下的執行結果(前提數據庫的AutoCommit為true)
?
其他情況按照事務是否開啟和是否拋出(捕獲)對應異常來判斷結果。
總結
以上是生活随笔為你收集整理的Spring框架-事务管理注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017电脑的主流配置是什么(2017电
- 下一篇: Spring Boot之程序性能监控