Spring框架-事务管理注意事项

转载自 Spring框架-事务管理注意事项

常见事务问题

  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的扫描。

配置如下:

<context:component-scan base-package="com.jiuyescm.xxx"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

如何通过日志判断事务是否已经被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)

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2568-GCD【欧拉函数,欧拉筛】

正题 题目链接:https://www.luogu.org/problemnew/show/P2568 题目大意 求有多少个数对满足gcd(x,y)pri(x,y≤n)gcd(x,y)pri(x,y\leq n)gcd(x,y)pri(x,y≤n) 解题思路 首先对于 gcd(x,y)pgcd(x,y)pgcd(x,y)p >gcd(x/p,y/p)1>gcd(x/p,y/p)1>gcd(x/p,y/p)1 那么对数就…

laravel允许所有网站进行跨域操作

共三步&#xff1a; 1、新建中间件&#xff1a; php artisan make:middleware EnableCrossRequestMiddleware2、EnableCrossRequestMiddleware.php中重写中间件里面的内容&#xff1a; <?php namespace App\Http\Middleware; use Closure; class EnableCrossRequestMidd…

Ocelot统一权限验证

Ocelot作为网关&#xff0c;可以用来作统一验证&#xff0c;接上一篇博客Ocelot网关&#xff0c;我们继续 前一篇&#xff0c;我们创建了OcelotGateway网关项目&#xff0c;DemoAAPI项目&#xff0c;DemoBAPI项目&#xff0c;为了验证用户并分发Token&#xff0c;现在还需要添…

P1081-开车旅行【倍增,链表,dp】

正题 题目大意:https://www.luogu.org/problemnew/show/P1081 题目大意 有若干个城市有不同的海拔hhh&#xff0c;两个城市之间的距离定义为∣hx−hy∣|h_x-h_y|∣hx​−hy​∣ 小A每次走次近的&#xff0c;小B每次走最近的。它们轮流开车。且只会往编号更大的城市开。 问一:…

Spring Boot之程序性能监控

转载自 Spring Boot之程序性能监控 Spring Boot特别适合团队构建各种可快速迭代的微服务&#xff0c;同时为了减少程序本身监控系统的开发量&#xff0c;Spring Boot提供了actuator模块&#xff0c;可以很方便的对你的Spring Boot程序做监控。 1. actuator接口说明 Spring B…

laravel部署在linux出现404 not found

laravel项目放在本地服务器后&#xff0c;访问是成功的 http://localhost/blogkjh/public/article 但是在linux服务器上访问显示404 not found 但是我在服务器上使用 php artisan serve --host 0.0.0.0 命令 却可以访问 甚至连swagger都可以访问 关于这个我最近就特别疑…

Visual Studio 2017 15.6版本预览,增加新功能

上周Visual Studio 2017 15.5 版本已正式发布&#xff0c;同时发布的还有 Visual Studio for Mac 7.3 。 Visual Studio 2017 15.6 版本预览&#xff0c;这个最新的预览包含新功能&#xff0c;生产力改进和其他增强功能&#xff0c;以解决客户的反馈意见。 本发行版中的更新摘要…

POJ1275-Cashier Employment【差分约束系统】

正题 题目链接:http://poj.org/problem?id1275 题目大意 1∼241\sim 241∼24小时中第iii个小时需要rir_iri​个出纳员 有nnn个人应聘&#xff0c;第iii从xix_ixi​开始工作&#xff0c;一直工作8个小时。 求至少要招募多少人应聘。 解题思路 numinum_inumi​表示第iii个小时有…

使用 mono 编译 .NET Standard 应用

微软发布 .NET Standard 2.0 已经有一段时间了&#xff0c; 根据 .NET Standard 2.0 支持版本的文档&#xff0c; Mono 5.4 是支持 .NET Standard 2.0 的&#xff0c; 对于 .NET Standard 2.0 应用的开发的介绍&#xff0c; 几乎全部都是在 Windows 系统下使用 Visual Studio 2…

nginx操作命令

启动 nginx 停止 nginx -s stop 查看占用端口号 ps -ef | grep nginx 重启&#xff1a; nginx -s reload nginx配置目录&#xff1a; /usr/local/nginx/conf/nginx.conf

Spring Boot 热部署入门

转载自 Spring Boot 热部署入门 1. 概述 在日常开发中&#xff0c;我们需要经常修改 Java 代码&#xff0c;手动重启项目&#xff0c;查看修改后的效果。如果在项目小时&#xff0c;重启速度比较快&#xff0c;等待的时间是较短的。但是随着项目逐渐变大&#xff0c;重启的速…

hdu3666-THE MATRIX PROBLEM【差分约束,自然对数】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid3666 题目大意 一个n∗mn*mn∗m的矩阵CCC求有没有一个长度为nnn的aaa序列和一个长度为mmm的bbb序列使得 L≤Ci,j∗ai/bi≤RL\leq C_{i,j}*a_i/b_i\leq RL≤Ci,j​∗ai​/bi​≤R 解题思路 首先我们将乘除转换为自然…

微服务架构的理论基础 - 康威定律

摘要&#xff1a; 可能出乎很多人意料之外的一个事实是&#xff0c;微服务很多核心理念其实在半个世纪前的一篇文章中就被阐述过了&#xff0c;而且这篇文章中的很多论点在软件开发飞速发展的这半个世纪中竟然一再被验证&#xff0c;这就是康威定律。前段时间看了Mike Amundsen…

nginx部署laravel需要修改的配置

让ssh一直在后台运行 nohup php artisan serve --host 0.0.0.0 > myout.file 2>&1 & 1、修改nginx.config里面的内容&#xff0c;把禁用函数去掉 2、修改php.ini display_errors Ondisplay_startup_errors On

阿里微服务架构下分布式事务Seata

转载自 阿里微服务架构下分布式事务Seata Seata 是什么&#xff1f; Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一…

用于.NET Core的ORM

尽管EF Core正努力提供视图和存储过程等基本数据库特性&#xff0c;但是开发人员也在寻求能满足他们数据访问需求的ORM工具。下面列出一些相对广为使用的ORM。 LLBLGen Pro Runtime Framework LLBLGen Pro Runtime Framework是一种“可选”的ORM&#xff0c;它是与LLBLGen实体建…

P3076,jzoj3187-的士【贪心】

正题 luogu题目链接:https://www.luogu.org/problemnew/show/P3076 题目大意 有若干个请求si,tis_i,t_isi​,ti​表示一个牛要从sis_isi​到tit_iti​。一辆只能装一只牛的车&#xff0c;从1出发mmm结束。求最少行驶距离。 解题思路 首先对于每个要求一定要计算∣ti−si∣|t…

Spring Boot之基于Dubbo和Seata的分布式事务解决方案

转载自 Spring Boot之基于Dubbo和Seata的分布式事务解决方案 1. 分布式事务初探 一般来说&#xff0c;目前市面上的数据库都支持本地事务&#xff0c;也就是在你的应用程序中&#xff0c;在一个数据库连接下的操作&#xff0c;可以很容易的实现事务的操作。但是目前&#xff…

Ocelot监控

网关的作用之一&#xff0c;就是有统一的数据出入口&#xff0c;基于这个功能&#xff0c;我们可以在网关上配置监控&#xff0c;从而把所有web服务的请求应答基本数据捕获并展显出来。 关于web的监控&#xff0c;一般的做法是采集数据并保存&#xff0c;然后通过图表的方式展示…

jzoj3188-找数【质数筛,数论】

正题 题目大意 求第nnn大的最小质因数时ppp的数。 解题思路 首先对于p2p2p2和p3p3p3时可以直接通过计算得出。 然后不难发现当p5p5p5时我们可以每次增加101010也就是O(n)O(n)O(n)的十分之一常数。 之后再往大的我们发现是O(nln⁡np)O(\frac{n\ln n}{p})O(pnlnn​)常数是二分之…