设计事务时应当注意 , 为使应用程序很好地运行 , 事务不能运行太长时间 , 因为事务可能涉及对后端数据库的锁定 , 因此长时间的事务会不必要的占用数据库资源 。
回滚规则回滚规则定义了哪些异常会导致事务回滚而哪些不会 。默认情况下 , 事务只有遇到运行期异常时才会回滚 , 而在遇到检查型异常时不会回滚 。
如果你需要自定义回滚 , 可以按照如下的策略进行:1、声明事务在遇到特定的检查型异常时 , 像遇到运行期异常那样回滚;2、声明事务遇到特定的异常不回滚 , 即使这些异常是运行期异常 。
TransactionStatus事务状态org.springframework.transaction.TransactionStatus接口用来记录事务的状态 , 该接口定义了一组方法 , 用来获取或判断事务的相应状态信息 。TransactionStatus接口源码如下:
public interface TransactionStatus extends SavepointManager, Flushable {boolean isNewTransaction();// 是否是新的事物boolean hasSavepoint();// 是否有恢复点void setRollbackOnly();// 设置为只回滚boolean isRollbackOnly();// 是否为只回滚void flush();// 刷新boolean isCompleted();// 是否已完成}Spring事务管理实现方式Spring事务管理有两种方式:编程式事务管理和声明式事务管理 。
编程式事务管理编程式事务管理通过TransactionTemplate手动管理事务 , 在实际应用中很少使用 , 但是可以了解一下 。
编程式事务管理实现方式通常有两种:事务管理器方式和模板事务方式 。
事务管理器(Platform Transaction Manaager)方式 , 类似应用JTA UserTransaction API方式 , 但异常处理更简洁;其核心类为:Spring事务管理的三个接口类以及Jdbc Template类 。
模板事务(Transaction Template)方式 , 此为Spring官方团队推荐的编程式事务管理方式;主要工具为Jdbc Template类 。
声明式事务管理声明式事务管理在实际开发中非常常见 , 因此需要仔细学习 。声明式事务管理基于AOP模式 , 对方法进行前后拦截 。
声明式事务管理的配置类型有5种 , 但是由于3中在Spring2.0后不推荐使用 , 因此这里主要就是两种:tx拦截器和全注释 。
声明式事务管理有三种实现方式:基于TransactionProxyFactoryBean的方式、基于AspectJ的XML方式、基于注解的方式 。接下来将以用户转账为例来学习这三种不同的实现方式 。
第一步 , 新建数据库spring_money和表account:
drop database if exists spring_money;create database spring_money;use spring_money;create table account(idbigint auto_increment primary key,namevarchar(32) not null,money bigintnot null,constraint account_name_uindexunique (name));insert into account (name, money) values('小明', 2000),('小白', 2000);第二步 , 新建Maven项目spring_money:其中pom.xml配置信息为:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.Apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.envy</groupId><artifactId>Spring_money</artifactId><version>1.0-SNAPSHOT</version><properties><spring.version>4.2.7.RELEASE</spring.version></properties><dependencies><!--Spring核心组件--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring.version}</version></dependency><!--Spring AOP组件--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><!--AspectJ AOP开发需要引入的两个包--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!--MySql驱动 , 注意版本号--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!--JDBC Template--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><!-- druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.25</version></dependency><!-- 测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency></dependencies></project>
推荐阅读
- 心理委员的职责是什么?
- Spring容器6种注入方式
- 通过深度系统学习Linux用户和组
- 如何正确控制springboot中bean的加载顺序总结
- Spring Boot 2.x基础教程:EhCache缓存的使用
- 黑客全家桶、文字提取利器、深度学习 500 问 | GitHub 热点速览
- 基于机器学习的自适应码率算法的进一步探索与改进
- 军事智能化之机器学习《清明上河图》里几个人几个牲口一览无余
- SpringBoot下使用定时任务的方式全揭秘
- 学习美甲以及美甲注意事项
