Spring揭秘-事务管理

2018-06-05  本文已影响0人  行动的侏儒
  1. 什么是事务?
    事务就是以可控的方式对数据资源进行访问的一组操作,它有四个限定属性,原子性、一致性、隔离性、持久性,就是我们常称的ACID属性。
  2. 隔离性的四种隔离级别由弱到强分别是Read Uncommited、Read Commited、Repeatable Read、Serializable。
  1. 全局事务和局部事务
    全局事务也叫分布式事务,通过两阶段提交协调多RM(Resource Manager一般是数据库)之间的事务处理,有个非常恰当的例子是婚礼上主持会分别问男女双方你愿意嫁给他吗?如果有任意一方拒绝,就各自回滚到单身状态。TP Monitor负责在分布式事务中协调多个RM的事务处理,TM是它的核心模块。


    全局事务

    只有一个RM参与的就叫局部事务,它不必引进TP Monitor,应用程序可以直接和RM打交道,全局事务和局部事务的区别是涉及多少RM,如果系统中有多个RM,但是事务只涉及一个RM,同样是局部事务。

  2. Spring事务


    Spring事务抽象接口关系图
public interface TransactionDefinition {
    /*传播行为*/
    //如果当前存在一个事务,则加入当前事务,如果不存在,则新建一个事务,至少保证在一个事务中运行
    int PROPAGATION_REQUIRED = 0;
    //如果当前存在一个事务,则加入当前事务,如果不存在,则直接执行
    int PROPAGATION_SUPPORTS = 1;
    //强制要求当前存在一个事务,如果不存在则跑出异常
    int PROPAGATION_MANDATORY = 2;
    //不管当前是否存在事务,都会创建新的事务,如果当前存在事务会挂起当前事务
    int PROPAGATION_REQUIRES_NEW = 3;
    //不支持当前事务,在没有事务的情况下执行,如果当前存在事务,会挂起当前事务
    int PROPAGATION_NOT_SUPPORTED = 4;
    //永远不需要当前存在事务,如果存在则抛出异常
    int PROPAGATION_NEVER = 5;
    //如果存在当前事务,则在当前事务的一个嵌套事务中执行
    int PROPAGATION_NESTED = 6;
    /*隔离级别*/
    //表示使用数据库默认的隔离级别
    int ISOLATION_DEFAULT = -1;
    //对应Read_Uncommitted隔离级别,无法避免脏读,不可重复读和幻读
    int ISOLATION_READ_UNCOMMITTED = 1;
    //对应Read Committed隔离级别,无法避免不可重复读和幻读
    int ISOLATION_READ_COMMITTED = 2;
    //对应Repeatable Read, 无法避免幻读
    int ISOLATION_REPEATABLE_READ = 4;
    //对应Serializable隔离级别,并发行最低,能避免所有问题
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();

    int getIsolationLevel();

    int getTimeout();

    boolean isReadOnly();

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

    boolean hasSavepoint();

    //标记当前事务使其回滚
    void setRollbackOnly();

    boolean isRollbackOnly();

    void flush();

    boolean isCompleted();
}
public interface PlatformTransactionManager {
    /*getTransaction会开启一个事务,但在此之前需要判断是否存在是否,
    如果存在则根据传播行为决定是挂起事务或者抛出异常,
    不存在事务,同样需要根据传播行为决定如何处理*/
    TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;
    /*检测全局的rollBackOnly,如果被设置则执行回滚*/
    void commit(TransactionStatus var1) throws TransactionException;
    /*检测全局的rollBackOnly,如果没被设置则执行提交*/
    void rollback(TransactionStatus var1) throws TransactionException;
}
上一篇 下一篇

猜你喜欢

热点阅读