spring的service不启动事务的配置。

为什么80%的码农都做不了架构师?>>>   hot3.png

原来是这样设置的:

        <tx:attributes>

            <tx:method name="*" read-only="true"/>

        </tx:attributes>

发现selectA调用selectB,如果selectB抛出Exception,selectA中捕获Exception但是并不继续向外抛出,最后会出现错误。

 

Transaction rolled back because it has been marked as rollback-only

纠其原理其实很简单,在selectB返回的时候,transaction被设置为rollback-only了,但是selectA正常消化掉,没有继续向外抛。

那么selectA结束的时候,transaction会执commit操作,但是transaction已经被设置为rollback-only了。

所以会出现这个错误。

有的同学说了,那不是没得搞了,service不能抛出异常,或者不能拦截异常了?

其实不然,其实错误不在这里,而是select这种操作为什么要启动事务呢?

调整好问题,找解决方案,问题就出现在propagation="REQUIRED"这个属性上。

标准文档上这样写:

MANDATORY 
          Support a current transaction, throw an exception if none exists.
NESTED 
          Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
NEVER 
          Execute non-transactionally, throw an exception if a transaction exists.
NOT_SUPPORTED 
          Execute non-transactionally, suspend the current transaction if one exists.
REQUIRED 
          Support a current transaction, create a new one if none exists.
REQUIRES_NEW 
          Create a new transaction, suspend the current transaction if one exists.
SUPPORTS 
          Support a current transaction, execute non-transactionally if none exists.

 

看来我们需要如下修改:

        <tx:attributes>

            <tx:method name="*" read-only="true" propagation="NOT_SUPPORTED"/>

        </tx:attributes>

这样select这样的检索操作根本就不启动事务了,而且在有事务的方法中也是可以正常调用select方法的。

现在就没问题了。

但是现在出现了另外一个问题,就是,如果在一个事物内对db进行操作,然后在出事物之前对刚才db操作的数据进行select是获取不到修改结果的,为什么呢?因为not——supported是会在执行select之前挂起原有事物,不在原有事物内,当然无法获得修改后的数据。

怎么办?改成supports:

        <tx:attributes>

            <tx:method name="*" read-only="true" propagation="SUPPORTS"/>

        </tx:attributes>

这个状态用一句话概括就是“有则加入事物,无也不创建事物”。


转载于:https://my.oschina.net/jing31/blog/10414

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

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

相关文章

@ConditionalOnJava注解使用

如果想让配置文件在特定的jdk版本中生效可以使用ConditionalOnJava注解 等于或大于指定的jdk版本 EQUAL_OR_NEWER 小于指定的jdk版本 OLDER_THAN 步骤一&#xff1a; 我项目用的jdk8 下面的注解表示jdk版本要大于等于jdk8才生效 ConditionalOnJava(range ConditionalOnJava…

nginx实现301(加密)跳转和200跳转

我们用nginx实现301跳转&#xff0c;下面我们先讲一下实现的大概思想&#xff0c;首先我们用yum或者编译安装nginx&#xff0c;然后配置nginx的主配置文件的子文件&#xff0c;&#xff08;在配置子文件的时候可以把默认文件先注释掉&#xff09;配置好子文件之后重启nginx服务…

《Sibelius 脚本程序设计》连载(四) - 1.1 创建第一个插件

《Sibelius 脚本程序设计》连载(Flash 格式) 转载于:https://www.cnblogs.com/Sibelius/archive/2010/12/01/1893324.html

面向对象编程——获取对象信息(五)

当我们拿到一个对象的引用时&#xff0c;如何知道这个对象是什么类型、有哪些方法呢&#xff1f; 使用type() 首先&#xff0c;我们来判断对象类型&#xff0c;使用type()函数&#xff1a; 基本类型都可以用type()类型&#xff1a; >>> type(123) <class int> &…

ASP.NET控件开发基础5

上一篇简单的讲了从WebControl继承的控件(好象我讲的都是简单的,嘿嘿).本次讲的更简单,主题是是属性,只当分享经验,希望对大家有帮助我们根据属性的不同表现形式,把其区分为简单属性和复杂属性下面来看下属性的表现形式简单属性表现形式如下,大家都很熟悉 <asp:TextBox ID&q…

项目Alpha冲刺Day4

一、会议照片 二、项目进展 1.今日安排 学习熟悉前台框架且搭建前台页面框架。 2.问题困难 使用了前端的构建工具webpack&#xff0c;困难在于怎么使用gradle结合它连同后台框架中的配置一起打包&#xff0c;因为本身都才刚接触这两者。本来希望每个人下好项目能配置尽量少的东…

log4j:ERROR Could not find value for key log4j.appender.stdout.layout

Connected to the target VM, address: 127.0.0.1:65401, transport: socket log4j:ERROR Could not find value for key log4j.appender.stdout.layout 此log4j:ERROR Could not find value for key log4j.appender.XXXX类型报错与log4j.properties文件写法有关系 处理方法&a…

linux下VMware_Tools虚拟机工具的安装

1 到菜单栏“虚拟机”里选择“安装VMware Tools(I)”虚拟机工具<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />2 挂载了VM虚拟机工具以后的Linux系统的界面3 右键“VMwareTools-6.0.2-59824.tar.gz”文件&#xff0c;复制到桌面…

第十二周学习笔记

先检查有没有对应类型的接口&#xff0c;没有必须先到网上下载&#xff0c;重新开启SQL SEVER即可 64位以上的系统必须用 Microsoft Ace Oledb 12.0 版本的 要选对数据库 没有查询到表格的可以建立表格 用INSERT INTO 语句可以插入数据 ----------删除 删除格式代码&#xff0c…

TechEd2010

微软&#xff08;中国&#xff09;TechEd2010今天在北京国家会议中心开幕了&#xff0c;还是和去年一样&#xff0c;场面做的很大。今年的主题是云&#xff0c;Windows Phone 7&#xff0c;和IE9。 会上&#xff0c;也见了非常多的朋友&#xff0c;有微软的老朋友&#xff0c;也…

错误: 找不到或无法加载主程序类 错误: 找不到或无法加载主类 wc.BatchWordCount

错误描述 编写完代码以后运行main方法&#xff0c;出现错误: 找不到或无法加载主类 错误: 找不到或无法加载主类 wc.BatchWordCount 解决办法 1、点击IDEA侧边的maven栏目&#xff0c;点击compile进行编译 2:显示BUILD SUCCESS表示编译成功 3、再次运行main方法&#xff0…

chmod与umask区分命令

chmod与umask区分命令chmod命令用于改变文件的目录的访问权限&#xff0c;他是一条非常重的系统命令。用户可以用其控制文件或目录的访问权限。 umask是创建文件或创建一个文件目录的一个默认权限。当使用不带参数的umask命令是&#xff0c;喜用会输出当前umask的值。 [rootloc…

Linux包管理速查表

使用Linux 系统总是免不了要接触包管理工具。比如&#xff0c;Debian/Ubuntu 的apt、openSUSE 的zypp、Fedora 的yum、Mandriva 的urpmi、Slackware 的slackpkg、Archlinux 的pacman、Gentoo 的emerge、Foresight 的conary、Pardus 的pisi&#xff0c;等等。DistroWatch 针对上…

C++ 序列化 serialization 如何将类持久化?

C的类的持久化可以通过下面文章中所使用的方法来实现 其原理是将对象的内容以二进制的形式保存到文件中, 在要读取的时候再使用相反的过程来加载到对象中. 总结起来就是可以为要进行持久化的对象,比如说配置类,添加如下的两个方法: bool Config::Save(){ ofstream ofs("co…

BZOJ 4808: 马(二分图最大点独立集)

http://www.lydsy.com/JudgeOnline/problem.php?id4808 题意&#xff1a; 思路&#xff1a; 这图中的两个马只能选一个&#xff0c;二选一&#xff0c;很像二分图吧&#xff0c;对能互吃的两个棋子连线&#xff0c;在所选的任意两个棋子中&#xff0c;都不能互相有连线&#x…

使用Flink批处理实现WordCount

Flink作为一个非常优秀的大数据实时计算框架&#xff0c;在很多从事大数据开发的公司都是必备的技能&#xff0c;接下来我将通过Flink以批处理来实现入门案例WordCount 1:步骤一 idea新建设maven项目&#xff0c;并且自己配置好maven环境 2&#xff1a;步骤二 在pom文件中加…

Application.DoEvents

记得第一次使用Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示&#xff0c;不至于系统出现假死的现象&#xff0c;当时也没有深入的去研究他的原理是怎样的&#xff0c;结果在很多地方都用上了Application.DoEvents()&#xff0c;今天看到了关于这方面…

Servlet交互【重定向 与 请求分派】详解

Servlet交互 在serlvet中&#xff0c;需要调用另外一个资源来对浏览器的请求进行响应&#xff0c;两种方式实现&#xff1a; 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用RequestDispatcher.forward 方法来实现请求分派 &#xff08;转发&#xff09; 1.reponse…