江苏建设厅网站,博客网站推荐,电子商务网址,wordpress oss转载自 Spring框架-事务管理注意事项
常见事务问题 事务不起作用 可能是配置不起效#xff0c;如扫描问题 事务自动提交了#xff08;批量操作中#xff09; 可能是在没事务的情况下#xff0c;利用了数据库的隐式提交
事务配置说明
通常情况下我们的Spring Component扫…转载自 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-packagecom.jiuyescm.xxxcontext:exclude-filter typeannotation expressionorg.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.ConnectionProxyImpl28cfe912] will be managed by Spring没有被控制的时候日志如下 DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl28cfe912] will not be managed by Spring如何通过程序判断是否存在事务
boolean flag TransactionSynchronizationManager.isActualTransactionActive();返回true则在事务控制下否则不在控制下
什么时候做了隐式提交
在没有容器事务的情况下系统会尝试隐时提交。 开发建议 所有Service代码中设置Class级别的Transactional并设置为只读开发时可以很容易发现误数据库操作的动作。如Transactional(readOnlytrue)。 所有Service代码中Public的方法设置Transactional并根据实际情况设置Propagation可以设置为REQUIRED。 对于有异常产生可能的情况下根据情况选择合适的rollbackFor默认情况下可以设置对Exception.class或BizException.class进行控制。 尽可能减少嵌套的使用方法Service call Service采用传统的Controller-》Service-》Repository(DAO)的模型。
如果需要深入了解Transaction的流程请自行翻阅和跟踪Spring和Mybatis相关代码。
以下是嵌套事务的各种情况下的执行结果前提数据库的AutoCommit为true 其他情况按照事务是否开启和是否抛出捕获对应异常来判断结果。