spring的事务处理本来就是依赖于底层的实现,比如hibernate及数据库本身。

所以,当使用mysql数据库时,首先要确定的是,所操作的对象表是innodb格式的。

1. read-only方法中进行更新或插入操作时,并不总报错

在service层的方法中定义了事务,并且在spring配置文件中定义了如下的传播方式:

<tx:attributes >
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" read-only= "true" />
</tx:attributes>

假设有一个实体名称为User,则如果在在service的一个方法中想保存或更新它,而这个方法又忘记了以save或update开头,就会导致一些莫名其妙的事情发生,有时会报错(这可以理解),但有时又不会报错,动作却没有执行,反复观察,发现以下规律:

当更新user的操作时,即此时user的主键不为null时,调用Dao中的Hibernate的saveOrUpdate方法时,程序不报错,但修改动作未起作用;

当进行插入操作时,此时user的主键为Null(库中的主键采用自增),此时调用saveOrUpdate方法时,程序报错:Connection is read-only. Queries leading to data modification are not allowed.

2. 在事务方法中抛出异常,并不总回滚

一个事务方法中:

xxxDao.save(user);
.....
throw new Exception("要求回滚");

  

抛出异常后,期望事务能回滚,观察数据库,却发现改变已写进持久层了。

原因是这样的:Spring、EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚。Exception这个异常是checked异常,所以无法触发回滚事件,如果换成抛出RuntimeException异常,则程序运行就符合预期了。

3. 事务方法嵌套调用

在一个service中,用一个read-only方法调用非read-only方法,则发现整个调用都read-only了。

这是因为:service内部方法间调用,被调用方法设定的事务行为将会失效,事务行为由最外层方法设置的事务行为控制。

4. 事务回滚未提交,并不表示对底层数据库没有任何影响。

下面的代码:

xxxDao.save(user);  

Integer userId = user.getId();
.....
throw new RuntimeException("要求回滚");

事务会成功回滚,数据表中也未插入新的记录。但观察发现,userId的值也取到了,比如说userId=9800,如果再向数据库增加一条记录,则自增的id值会变成9801!

也就是说,虽然由于事务回滚没有向持久层插入记录,但数据表的自增字段的值已经被改变了。(这一块的机制细节没功夫研究了,有人了解的话,告诉我一下)

在spring+hibernaet+mysql事务处理中遇到的一些坑的更多相关文章

  1. Spring+Mybatis+Mysql搭建分布式数据库访问框架

    一.前言 用Java开发企业应用软件, 经常会采用Spring+MyBatis+Mysql搭建数据库框架.如果数据量很大,一个MYSQL库存储数据访问效率很低,往往会采用分库存储管理的方式.本文讲述如 ...

  2. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

  3. springmvc学习总结(二) -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

    @_@ 写在最前 之前分享过下面这几篇: mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上)(附demo和搭建过程遇到的问题解决方法) myba ...

  4. SpringMVC+Spring+mybatis项目从零开始--Spring mybatis mysql配置实现

    上一章我们把SSM项目结构已搭建(SSM框架web项目从零开始--分布式项目结构搭建)完毕,本章将实现Spring,mybatis,mysql等相关配置. 1.    外部架包依赖引入 外部依赖包引入 ...

  5. Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建

    目录 Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建 0.项目准备 1.数据持久层Mybatis+MySQL 1.1 MySQL数据准备 1.2 Mybatis ...

  6. FW: How to use Hibernate Lazy Fetch and Eager Fetch Type – Spring Boot + MySQL

    原帖 https://grokonez.com/hibernate/use-hibernate-lazy-fetch-eager-fetch-type-spring-boot-mysql In the ...

  7. maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

    转自:https://www.cnblogs.com/lmei/p/7190755.html?utm_source=itdadao&utm_medium=referral @_@ 写在最前 之 ...

  8. 使用Spring实现MySQL读写分离(转)

    使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ...

  9. SpringMVC+Spring+Mybatis+Mysql项目搭建

    眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...

随机推荐

  1. 虚拟化之docker

    1,什么是docker dokcer是应用容器,它是基于系统的虚拟化,他不是基于硬件的虚拟化(KVM),可能这样说有点抽象,我在知乎看到过一个比喻, docker思想是来源于集装箱的,在一艘大船上,可 ...

  2. attr()和prop()的区别

    引用以为一位大神的文章: http://www.365mini.com/page/jquery-prop.htm http://www.365mini.com/page/jquery-attr-vs- ...

  3. Sql Server中charindex、patindex的区别

    SQL代码如下: select charindex('1,','121,1,1234') select patindex('%1,%','121,1,1234') ','121,1,1234') se ...

  4. SQL server根据值搜表名和字段

    DECLARE @what varchar(800) SET @what='lll' --要搜索的字符串 DECLARE @sql varchar(8000) DECLARE TableCursor ...

  5. c++设计模式之状态模式

    一. 状态模式 定义:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 实现方式1: workstate 状态抽象类 workstate1 状态实现类1 workstate2 ...

  6. ARM编译空间属性(转)

    原文地址:http://www.cnblogs.com/hongzg1982/articles/2205093.html 1. 程序的空间属性 一般情况下,一个程序本质上都是由 bss段.data段. ...

  7. 实习小白笔记一(鼠标悬停、获取多选、提交修改、layer页面、单元格文字长度、json、分页、左连接)

    ①easyui 当鼠标悬停显示单元格信息: $(this).datagrid('doCellTip',{'max-width':'600px','delay':300}); ②jquery 获取che ...

  8. UML中九种图的理解

    1.用例图. 用例图是用来描述用户需求的,从用户的角度来描述系统的功能,并指出各个执行者.强调谁在使用,系统的执行者是谁. 2.类图. 用来定义系统中的类,包括描述类的结构和类之间的关系.类图的主要作 ...

  9. 【Ecstore2.0】第三方信任登陆问题解决_备忘

    ECSTORE2.0的信任登陆模块开启后,需要拿着授过权的ID在官网进行配置才可以使用,但是客户的授权证书一时无法使用,而跳过认证的话功能又用不了,所以就自己临时搭了一个测试用的认证服务器和信任登陆平 ...

  10. Yii2.0 UrlManager

    服务器软件的配置与1.0一致即可.. 在组件中进行如下配置: 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' = ...