spring-事务

2020-03-19  本文已影响0人  格林哈

1. 事务本身 ACID属性

  1. 原子性 Atomicity
    • 事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,就全部失败。
  2. 一致性 Consistency
    • 事务所包含的操作不能违反数据资源的一致性检查,数据资源在事务执行之前处于某个数据一致性状态,那么,事务执行之后也依然需要保持数据间的一致性状态。
  3. 隔离性 Isolation
    • 主要规定了各个事务之间相互影响的程度。隔离性概念主要面向对数据资源的并发访问(Concurrency),并兼顾影响事务的一致性
事务隔离级别对并发问题的解决情况
  1. 持久性 Durability
    • 一旦整个事务操作成功提交,对数据所做的变更将被记载并不可逆转,

2. Spring 事务

2.1 基本原则:让事务管理的关注点与数据访问关注点相分离

2.2 Spring支持事务管理的核心是事务管理器抽象,对于不同的数据访问框架(如Hibernate)通过实现策略接口PlatformTransactionManager,从而能支持各种数据访问框架的事务管理:

Spring事务抽象接口关系图
public class DefaultTransactionAttribute extends DefaultTransactionDefinition implements TransactionAttribute {
//unchecked-exception(将派生于Error或者RuntimeException的异常称为unchecked异常) 
   public boolean rollbackOn(Throwable ex) {
        return ex instanceof RuntimeException || ex instanceof Error;
    }

    //.....
}

public interface TransactionStatus extends SavepointManager, Flushable {
    boolean isNewTransaction();

    boolean hasSavepoint();

    void setRollbackOnly();

    boolean isRollbackOnly();

    void flush();

    boolean isCompleted();
}

2.3 编程式事务管理

2.4 声明式事务管理

@Target({ElementType.METHOD, ElementType.TYPE})
@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 -1;
    //是否为只读事务
    boolean readOnly() default false;
    //设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚
    Class<? extends Throwable>[] rollbackFor() default {};
    //需要进行回滚的异常类名称数组 @Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
    String[] rollbackForClassName() default {};
    //不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚@Transactional(noRollbackFor={RuntimeException.class, Exception.class})  Exception.class})
    Class<? extends Throwable>[] noRollbackFor() default {};
   //不需要进行回滚的异常类名称数组 @Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
    String[] noRollbackForClassName() default {};
}

    <tx:advice id="txManager" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"
                       read-only="false" />
            <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED"
                       read-only="false" />
            <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED"
                       read-only="false" />
            <tx:method name="Update*" isolation="DEFAULT" propagation="REQUIRED"
                       read-only="false" />
            <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED"
                       read-only="true" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut expression="execution(* com.gerp.common.service.ServiceSupport+.*(..))"
                      id="perform" />
        <aop:advisor pointcut-ref="perform" advice-ref="txManager" />
    </aop:config>
上一篇下一篇

猜你喜欢

热点阅读