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