Spring框架-事务管理注意事项
发布日期:2021-07-01 01:15:52 浏览次数:2 分类:技术文章

本文共 1621 字,大约阅读时间需要 5 分钟。

转载自 

常见事务问题

  1. 事务不起作用

    • 可能是配置不起效,如扫描问题

  2. 事务自动提交了(批量操作中)

    • 可能是在没事务的情况下,利用了数据库的隐式提交

事务配置说明

通常情况下我们的Spring Component扫描分为两部分,一部分是Spring Servlet(MVC),一部分是其他Context Config的内容。主要扫描Annotation定义,包括@Controller@Autowired@Resource@Service@Component@Repository等。

Spring Servlet部分的扫描配置可以通过web.xmlDispatchServletinit-param节点配置确定。

Context Config部分的扫描配置为非以上配置的其他Spring配置文件确定。

为了能够使用事务,需要防止因Spring Servlet的扫描导致@Service事务配置失效。可以调整DispatchServlet中的配置文件,排除对@Service的扫描。

配置如下:

如何通过日志判断事务是否已经被Spring所管理?

  1. 在logback或者log4j中对org.springframework.aop、org.springframework.transaction、org.springframework.jdbc、org.mybatis.spring.transaction进行DEBUG级别日志跟踪(开发期)

  2. 查看日志中是否有事务管理、开启、提交、回滚等字符,如:

    DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@28cfe912] will be managed by Spring
  3. 没有被控制的时候,日志如下:

    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,则在事务控制下,否则不在控制下

什么时候做了隐式提交?

在没有容器事务的情况下,系统会尝试隐时提交。

开发建议:

  1. 所有Service代码中设置Class级别的@Transactional,并设置为只读,开发时可以很容易发现误数据库操作的动作。如:@Transactional(readOnly=true)。

  2. 所有Service代码中Public的方法设置@Transactional,并根据实际情况设置Propagation,可以设置为REQUIRED。

  3. 对于有异常产生可能的情况下,根据情况选择合适的rollbackFor,默认情况下可以设置对Exception.class或BizException.class进行控制。

  4. 尽可能减少嵌套的使用方法(Service call Service),采用传统的Controller-》Service-》Repository(DAO)的模型。

如果需要深入了解Transaction的流程,请自行翻阅和跟踪Spring和Mybatis相关代码。

以下是嵌套事务的各种情况下的执行结果(前提数据库的AutoCommit为true)

 

其他情况按照事务是否开启和是否抛出(捕获)对应异常来判断结果。

转载地址:https://maokun.blog.csdn.net/article/details/105340900 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring Boot之程序性能监控
下一篇:Spring Boot MongoDB 入门

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月10日 18时16分06秒