Spring事务事务是逻辑上的一组操作,要么都执行,要么都不执行 事务的特性(ACID)
Spring管理事务的方式有几种程序是否支持事务是取决于数据库是否支持事务
Spring事务管理接口介绍Spring中事务管理相关的最重要的三个接口如下
PlatformTransactionManager:事务管理接口Spring并不直接管理事务,而是提供了多种事务管理器。spring通过该事务管理接口为多个平台提供了对应的事务管理器,具体的实现就是各个平台自己的事情了。 该接口主要是将事务管理行为抽象出来,然后不同的平台去实现它,可以保证提供给外部的行为不变,方便我们扩展。 TransactionDefinition:事务属性该类定义了一些基本的事务属性。
TransactionStatus:事务状态该接口用来记录事务的状态,该接口定义了一组方法,用来获取或判断事务的相应状态信息。 public interface TransactionStatus{ boolean isNewTransaction(); // 是否是新的事务 boolean hasSavepoint(); // 是否有恢复点 void setRollbackOnly(); // 设置为只回滚 boolean isRollbackOnly(); // 是否为只回滚 boolean isCompleted; // 是否已完成 } 事务属性详解Spring事务传播行为(枚举类:Propagation)事务传播行为是为了解决业务层之间互相调用的事务问题。 当事务方法被另一个事务方法调用时,必须制定事务应该如何传播。例如:方法可能继续在现有的事务中运行,也可能开启一个新事务,并在自己的事务中运行。
Spring事务中的隔离级别(枚举类:Isolation)TransactionDefinition接口中定义了五个表示隔离级别的常量。
事务超时属性所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在TransactionDefinition中以int的值来表示超时时间,其单位是秒,默认值是-1 事务只读属性对于只有读取数据查询的事务,可以指定事务类型为readonly,即只读属性。只读事务不涉及数据的修改,数据库会提供一些优化手段,适合用在有多条数据库查询操作的方法中。
如果不加Transaction,每条sql会开启一个单独的事务,中间被其他事务改了数据,都会实时读取到最新值。 如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询 SQL 必须保证整体的读一致性,否则,在前条 SQL 查询之后,后条 SQL 查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持 事务回滚规则这些规则定义了那些异常会导致事务回滚而那些不会。默认情况下,事务只有遇到了运行时异常(RuntimeException的子类)时才会回滚,Error也会导致事务回滚,但是在遇到检查型(Checked)异常时不会回滚。 如果要定义你回滚的异常类型可以这样 @Transactional(rollbackFor = MyException.class) @Transaction注解作用范围
常用配置参数@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; } @Transactional的常用配置参数总结
@Transaction事务注解原理@Transaction的工作机制是基于AOP实现的,AOP有事使用动态代理实现的。如果目标对象实现了接口,默认情况下采用JDK的动态代理,如果对象没有实现接口,会使用Cglib来做动态代理
如果一个类或者一个类中的public方法上被标注@Transaction注解的话,Spring容器会在启动的时候为其创建一个代理类,在调用被@Transaction注解的public方法的时候,实际调用的是TransactionInterceptor类中的invoke方法。这个方法的作用就是在目标方法之前开启事务,方法执行过程中如果遇到异常的时候回滚事务,方法调用完成后提交事务。 注解失效情况应用在非public修饰的方法上Spring AOP自调用问题若同一类中的其他没有@Transaction注解的方法内部调用有@Transaction注解的方法,有@Transaction注解的方法的事务会失效。 这是由于Spring AOP代理的原因造成的,因为只有@Transaction注解的方法在类以外被调用的时候,Spring事务管理才生效。 解决方法就是避免同一类中自调用或者使用AspectJ取代Spring AOP代理。 propagation属性设置错误rollbackFor属性设置错误try/catch中没有抛出异常导致失效数据库不支持事务最后
——我是冢狐,和你一样热爱编程。 |
|