Spring不直接管理事务,它提供了事务管理器,但是具体相关管理职责由 Hibernate、MyBatis 等持久层框架实现。由这些持久层框架实现与数据库服务的通信。
@Transactional
使用Spring提供的事务框最普遍的方式是 在事务方法上添加标记 @Transactional,并设置相关属性。如:
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.REPEATABLE_READ) public void runInTransaction() { ... }
public @interface Transactional { // 事务的 名称 String value default ""; // 事务的 传播方式 Propagation propagation() default Propagation.REQUIRED; // 事务的 隔离级别 Isolation isolation() default Isolation.DEFAULT; // 事务的 超时时长 int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; // 事务是否 只读 boolean readOnly() default false; // 遇到这些异常时 触发事务回滚。默认遇到 RuntimeException 和 Error 时回滚;受检异常不回滚。 Class<? extends Throwable>[] rollbackFor() default(); // 其它回滚机制设置 String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }
PlatformTransactionManager
PlatformTransactionManager 是 Spring 事务管理架构中的中央接口。
实际使用时一般通过注解的形式(AOP)使用,而不是直接调用这些方法。
public interface PlatformTransactionManager { // 获取事务的状态 TransactionStatus getTransaction(TransactionDefinition definition); // 提交事务 void commit(TransactionStatus status); // 回滚事务 void rollback(TransactionStatus status) }
TransactionDefinition
TransactionDefinition 定义了事务的一些属性,包括“传播行为”、“隔离级别”、“是否只读”、“超时时长”、“名称”。
这些属性会在 Spring事务管理机制 中被使用。
传播行为 用于处理事务嵌套的情况;
隔离级别 用于处理事务并发的情况;
事务 超时时长 表示允许事务执行的最长时间。如果事务超时未完成,就会自动回滚;
事务 只读 表示对事务性资源只读。如果确定事务只包含读操作,可将其标记为只读,以提高性能。
public interface TransactionDefinition { // 获取事务的 传播行为 int getPropagationBehavior(); // 获取事务的 隔离级别 int getIsolationLevel(); // 获取事务的 超时时长 int getTimeout(); // 判断事务 是否只读 boolean isReadOnly(); // 获取事务 名称 String getName(); }
TransactionStatus
TransactionStatus 提供了一组方法用于获取事务的状态。
public interface TransactionStatus { // 判断事务 是否为新建的事务 boolean isNewTransaction(); // 判断事务 是否有保存点 boolean hasSavepoint(); // 将事务设置为 只回滚 void setRollbackOnly(); // 判断事务 是否为只回滚 boolean isRollbackOnly(); // 判断事务 是否已完成 boolean isCompleted(); }
Spring 支持的事务隔离级别
对事务的支持是由数据库提供的。Spring 只是个框架,它方便我们使用数据库提供的事务特性。
SQL-1992 中定义的4个隔离级别在Spring中都有对应的标识。
此外Spring还提供了一个隔离级别标识,Isolation_Default,用于使用数据库默认的隔离级别。
Spring 的事务传播行为控制
Spring 的事务传播行为控制机制用于支持业务层中的事务嵌套场景。
当一个事务方法被另一个事务方法调用时,这个被调用的事务方法可能需要在当前事务中运行,也有可能需要新开一个事务运行。
Spring定义了 7种 事务传播行为:
支持当前事务的传播行为
- Propagation_Required:如果当前存在事务,则加入当前事务;否则创建一个新事务。(默认)
- Propagation_Supports:如果当前存在事务,则加入当前事务;否则以非事务的方式运行。
- Propagation_Mandatory:如果当前存在事务,则加入当前事务;否则抛出异常。
不支持当前事务的传播行为
- Propagation_Requires_New:创建一个新事务。如果当前已经有事务,则挂起当前事务。
- Propagation_Not_Supported:以非事务方式运行。如果当前已经有事务,则挂起当前事务。
- Propagation_Never:以非事务方式运行。如果当前已经有事务,则抛出异常。
其它传播行为
- Propagation_Nested:如果当前存在事务,则创建一个新事务作为嵌套事务运行;否则创建一个新事务。
前 6种 传播行为借鉴自EJB,概念相同。PROPAGATION_NESTED 是 Spring 特有的。
内嵌事务基于JDBC的 SavePoint 实现。
只有外部事务提交,内嵌事务才能提交。
外部事务回滚,会引起内嵌事务回滚。
相关推荐
Java高级编程 实验报告 spring 声明事务 实验目的 掌握spring 声明式事务管理配置 实验环境 本实验采用本实验采用的eclipse或者 Myeclpse开发工具。Spring 4.0以上 Jdk1.7以上、oracle/mysql。
jdbc+spring+mysql事务理解和分析
3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二、 实验内容 1、在MySQL中创建以下三张表,其中account为账户表,book为书籍信息...
在Spring中使用JTA事务管理 1 通过集成JOTM,直接在Spring中使用JTA事务 1.1. 将JOTM以下类库添加到类路径中 1.2. 编写JOTM配置文件,放到类路径下 1.3. 在MySQL上建立两个数据库 1.4. 在Spring配置文件中配置JOTM ...
maven spring mybatis mysql 事务管理 企业级开发
一个简单的spring+hibernate+mysql 事务实例
两个项目,一个项目是基于spring jdbc实现的分布式事务,一个是基于spring hibernate的分布式事务,hibernate项目里的applicationContext2.xml...这两个项目下来,关于spring事务这一块基本上明了,绝对对得起这个分数
Spring+Mybatis+MySql+Maven 简单的事务管理案例.rar
Spring事务操作示例(四种方式),包含完整代码和数据库文件(基于MySQL,在项目sql文件夹中),可运行,学习Spring事务详见博客:http://blog.csdn.net/daijin888888/article/details/51822257
spring +springboot+mybatis+maven 读写分离,数据库采用mysql, 采用springboot 采用项目框架搭建,继承spring 中的AbstractRoutingDataSource,实现 determineCurrentLookupKey 进行数据源的动态切换,采用Spring ...
业务层:Spring IOC、Aop事务控制、Spring Task任务调度、Feign、Ribbon、Spring AMQP、Spring Data Redis等。 控制层:Spring MVC、FastJSON、RestTemplate、Spring Security Oauth2+JWT等 微服务治理:Eureka、...
资源名字:基于Spring+SpringMVC+MyBatis+mysql的班级事务管理系统设计与实现(源码).zip 资源内容:项目全套源码+完整文档 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 开发语言:Java JDK版本...
这是一个Spring+Mybatis+Mysqls的Java程序,主要是用来学习Spring的事务的,感兴趣的可以下载。
52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf
注意:只是jdbc自带的jdbctample,不能 用于整合mybatis框架的事务,我整合了,事务不起作用!!!! 按老师的说法是基于xml方式,但不准确,因为也用到了注解 <aop:aspectj-autoproxy proxy-target-class="true">...
花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...
持久化层使用Mybatis,项目管理Maven3, 1.前后端分离项目,前端使用vue框架 2.后端使用Java编程语言的Springboot框架 3.项目中登录模块用到token 详细情况查看我个人博客https://blog.csdn.net/yibo2022
Spring Batch可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和资源管理等重要功能。 业务方案: 1、批处理定期提交。 2、并行批处理:并行处理工作。 3、...
spring mvc hibernate整合,采用MyEclipse自动生成包和配置文件,jar包可能有多余,但是不影响整体效果。服务器tomcat。数据库mysql。
完整的例子,成功运行. 配好mysql数据库后,可以直接main方法测试事务.