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!
也就是说,虽然由于事务回滚没有向持久层插入记录,但数据表的自增字段的值已经被改变了。(这一块的机制细节没功夫研究了,有人了解的话,告诉我一下)
相关推荐
基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统 基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统 基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统 基于SSM(springmvc+spring+mybatis)+...
基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统源码.zip 基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统源码.zip 基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统源码.zip 基于SSM...
这个压缩包文件的标题"webwork+spring+hibernate"表明它包含了这三个框架的集成示例或者配置文件,可能是一个项目的基础结构。由于大小问题,原压缩包中的`lib`目录已删除,意味着用户需要自行准备相应的依赖库。 *...
Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境
《基于Spring MVC+Spring+Hibernate+Bootstrap+MySQL的考勤及薪酬管理系统详解》 在现代企业信息化管理中,考勤和薪酬管理是至关重要的部分,它们直接影响到员工的工作积极性和公司的运营效率。本文将深入探讨一个...
在"Struts2+Spring+Ibatis+MySQL"的架构中,MySQL作为数据存储后端,与Ibatis配合,处理应用程序的数据交互。 5. **AOP日志管理与异常捕获**:在Spring框架中,可以利用AOP实现全局的日志管理和异常捕获。通过定义...
在企业级Java开发中,"Maven + Spring + MyBatis + MySQL + 事务管理"是一个常见的技术栈组合,它们各自扮演着不同的角色,构建出高效、稳定的后端系统。 **Maven** 是一个项目管理和综合工具,它帮助开发者管理...
在本项目中,我们主要利用Spring框架,包括其核心模块Spring、MVC模块Spring MVC以及数据访问/集成模块Spring JDBC,结合MySQL数据库来构建一个基础的登录注册系统。以下是这个项目涉及的关键技术点: 1. **Spring...
Struts2+Spring+Hibernate+JSP+MySQL5是一个经典的Java Web开发框架组合,也被称为SSH框架。这个项目申报系统是基于这些技术构建的,它提供了高效、灵活且可扩展的后端架构来处理复杂的业务逻辑和数据管理。以下是...
Spring Batch可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和资源管理等重要功能。 业务方案: 1、批处理定期提交。 2、并行批处理:并行处理工作。 3、...
spring+springboot+mysql学生管理系统源码,应付大学毕设答辩足够了,部署非常简单。 spring+springboot+mysql学生管理系统源码,应付大学毕设答辩足够了,部署非常简单。 spring+springboot+mysql学生管理系统...
基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring ...
Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统。 Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统 Spring+SpringMVC+...
本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...
在Spring+Mybatis的项目中,Mysql作为数据存储的载体,存储业务数据,通过Mybatis的SQL映射文件与Java对象进行交互。 4. **项目结构**:一个典型的Spring+Mybatis+Mysql项目通常会包含以下主要模块: - **src/main...
以下是对`jdbc+spring+mysql事务理解和分析`的详细说明: 1. **原子性(Atomicity)**:这是事务的基本特性,表示事务中的所有操作要么全部成功,要么全部回滚。如果在事务执行过程中发生错误,数据库会撤销所有已...
【纯净的Spring+Hibernate+MySQL】项目是一个典型的Java Web应用示例,它将Spring MVC、Hibernate ORM框架与MySQL数据库相结合,以实现用户登录、注册等基础功能。在本项目中,Spring MVC作为控制层,负责处理HTTP...
在Spring+Hibernate的集成中,Spring可以作为Hibernate的事务管理器,处理事务的开始、提交、回滚等操作。通过SessionFactory和Session接口,Hibernate可以进行对象持久化,将Java对象转换为数据库中的记录。 **...
标题中的"全注解 spring boot +spring security + mybatis+druid+thymeleaf+mysql+bootstrap"是一个集成开发环境的配置,涉及到的主要技术有Spring Boot、Spring Security、MyBatis、Druid、Thymeleaf、MySQL以及...