Spring中事务Transactional

Spring中事务遵循的是数据库中的事务,具有ACID的特性

  A(原子性):是指事务是一个不可分割的流程,要么全部成功,要么全部失败

  C(一致性):事务前后的数据完整性保持一致

  I(隔离性):多用户并发的场景下,每一个用户开启的事务不被其他事务干扰

  D(持久性):事务一旦被提交,就是永久性的

事务的隔离级别现象:

  脏读:一个事务读取了另一个事务未提交的数据

  不可重复读:在一个事务内读取同一行数据,多次读取结果不同

  虚读(幻读):在事务中读取到了别的事务操作的数据,导致前后读取的结果不一样

事务的隔离级别设置:  

  Serializable 可避免脏读、不可重复读、虚读情况的发生。(串行化)
  Repeatable read 可避免脏读、不可重复读情况的发生。(可重复读)
  Read committed 可避免脏读情况发生(读已提交)。
  Read uncommitted 最低级别,以上情况均无法保证。(读未提交)

Spring中注解@Transactional
public @interface Transactional {
   //@AliasFor注解:为属性声明别名,成对出现
    使用场景:两个值不冲突,且可以相互获取值
    使用限制:互为别名的属性类型、默认值是相同的,必须设置默认值 //事务管理器
   @AliasFor(
"transactionManager") String value() default "";    @AliasFor("value") String transactionManager() default ""; String[] label() default {}; //事务传播机制 Propagation propagation() default Propagation.REQUIRED; //事务隔离级别 Isolation isolation() default Isolation.DEFAULT; //超时时间,以秒为单位 int timeout() default -1; String timeoutString() default "";   //事务读写性 boolean readOnly() default false; //一组异常类,遇到异常回滚 Class<? extends Throwable>[] rollbackFor() default {};   //一组异常类名,遇到时回滚 String[] rollbackForClassName() default {}; //一组异常类,遇到异常不回滚 Class<? extends Throwable>[] noRollbackFor() default {}; //一组异常类名,遇到异常不回滚 String[] noRollbackForClassName() default {}; }
传播行为Propagation
public enum Propagation {
    REQUIRED(0), -- 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
    SUPPORTS(1), -- 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 
    MANDATORY(2), -- 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
    REQUIRES_NEW(3), -- 如果当前存在事务,则把当前事务挂起;如果当前没有事务,则创建一个新事务
    NOT_SUPPORTED(4), -- 如果当前存在事务,则把当前事务挂起;如果当前没有事务,则以非事务方式运行
    NEVER(5),  -- 如果当前存在事务,则抛出异常;如果当前没有事务,则以非事务方式运行
    NESTED(6); -- 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则创建一个新的事务。
}
隔离级别Isolation
public enum Isolation {
    DEFAULT(-1), //默认值 ,表示使用数据库中的隔离级别
    READ_UNCOMMITTED(1), //未提交读 
    READ_COMMITTED(2), //已提交读,可以防止脏读
    REPEATABLE_READ(4),//可重复读,可以防止脏读和不可重复读
    SERIALIZABLE(8); //串行化,事务依次执行,可以防止脏读、不可重复读、幻读
}
 使用方式

 1.在具体的类方法(bean)上使用@Transactional

 2.可以被应用于接口定义和接口方法、类定义和类的public方法上

 3.只能在public上使用是因为Spring AOP 的特性。

if (this.allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
            return null;
     }

 

}
}
posted @ 2022-04-13 18:33  小辉辉。。  阅读(124)  评论(0)    收藏  举报