spring支持编程式事务和声明式事务
编程式事务是使用Transaction(trans-action) Template(temp-late)或者直接使用底层的Platform TransactionManager,对于编程式事务管理spring推荐使用Transaction Template
声明式事务是建立在AOP(面向切面)之上的,其本质就是在方法执行前后进行拦截,然后在目标方法开始执行之前创建或加入一个事务,在目标方法执行后根据情况执行提交或回滚,在项目中的体现就是在目标方法上添加一个@Transactional注解或者在xml配置文件中配置(声明式事务管理有优于编程式事务管理 所有基本上都是使用声明式事务)
@Transational注解有十个属性:
(常用的是propagation,isolation,timeout,readOnly,rollbackFor,或者全部使用默认值)
1.value: String类型可选的限定描述符,指定使用的事务管理器)
2.propagation: 枚举类型 可选事务传播行为设置 默认是Required 表示如果当前存在事务,则加入事务,如果不存在,这创建一个新的事务
3.isolation: 枚举类型 可选事务隔离级别设置 默认是Defalut 表示使用底层数据库的默认隔离级别
4.timeout: 事务超时时间设置 单位是秒 默认使用底层事务系统的超时值,如果底层没有设置,就没有超时限制
5.readOnly: 布尔类型 表示事务类型 读写或只读事务.默认是读写(false) true表示只读
6.rollbackFor:对象数组 设置导数事务回滚的异常类数组 一般使用Exception.class 表示只要有异常就回滚
7.norollbackFor:对象数组 和rollbackFor相反设置不会导致事务回滚的异常类数组
8.rollbackForClassName::String[] 是一个类名数组 设置事务回滚的异常类类名数组
9.noRollbackForClassName:String[] 是一个类名数组 和rollbackForClassName相反 设置不会导致事务回滚的异常类类名数组
10.transactionManager:等同于value 互为别名
@Transational注解的用法:
1. 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法类定义和类的 public 方法上。
2. @Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用@Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。
3. 注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据。必须在配置文件中使用配置元素,才真正开启了事务行为。spring启用事务注解 :<tx:annotation-driven transaction-manageer=“transactionManager”></tx:annotation-driven >
如果是spring boot项目 在入口类上使用@EnableTransactionManagement注解开启事务
4. 通过 元素的 “proxy-target-class” 属性值来控制是基于接口的还是基于类的代理被创建。如果 “proxy-target-class” 属值被设置为 “true”,那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 “proxy-target-class” 属值被设置为 “false” 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
6. @Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
1.spring事务隔离级别
TransactionDefiniton(事务定义接口)接口中定义了五个表示隔离级别的常量:
ISOLATION_DEFAULT (默认值,表示使用底层数据库的默认隔离级别)
ISOLATION_READ_UNCOMMITTED 读未提交
ISOLATION_READ_COMMTTTED 读已提交
ISOLATION_REPEATABLE_READ 重复读取
ISOLATION_SERIALIZABLE 串行化
2.spring事务传播行为
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为.在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。
3.spring事务的超时
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
4.spring事务只读属性
只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候。
默认为读写事务。
5.spring事务回滚规则
指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。
默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。
可以明确的配置在抛出那些异常时回滚事务,包括checked异常。也可以明确定义那些异常抛出时不回滚事务。还可以编程性的通过setRollbackOnly()方法来指示一个事务必须回滚,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。