2018-1-5 by Atlas


+ 简述

事务是一组逻辑连续的操作,这些操作组合成一个完整的、逻辑的操作。

1. 事务原则

  • 原子性(atomicity):
    事务是原子操作,组成事务的所有操作的执行结果,要么都成功,要么都不成功,不可能部分成功部分不成功。
  • 一致性(consistency):
    事务执行前后,完整性约束没有被破坏,包括数据完整、逻辑完整。
  • 隔离性(isolation):
    并发的事务执行互不干扰,这些事务并发执行结果和它们先后单独执行结果一样。
  • 持久性(durability):
    事务执行完成,事务执行的所有操作结果都会被持久化。

2. 事务隔离

之所以进行事务隔离,是因为事务并发可能产生问题:

  • 脏读(dirty read):
    一个事务执行过程中读取到了其他事务没有提交随后撤销的中间状态数据,并发的事务操作后可能对并发访问的数据造成完整性约束的破坏。
  • 不可重复读(non-repeatable read):
    一个事务执行过程中读取到了其他事务已经提交的数据,这个事务多次访问的数据发生内容更新,可能影响事务逻辑的完整性约束。
  • 幻读(phantom read):
    一个事务执行过程中读取到了其他事务已经提交的数据,这个事务多次访问的数据发生数量更新,可能影响事务逻辑的完整性约束。

事务隔离是手段,隔离级别:

  • read uncommitted:
    存在发生脏读、不可重复读、幻读的情况。
  • read committed:
    解决了脏读,存在发生不可重复读、幻读的情况。
  • repeatable read:
    解决了脏读、不可重复读,存在发生幻读的情况。
  • serializable:
    事务串行,不存在事务并发导致的脏读、不可重复读、幻读问题。
    理论上世间万物相生相克,不同隔离级别的实现解决问题的程度不同,自然耗费的时间、空间资源也不同,按需选择。

3. spirng事务定义

public interface TransactionDefinition {
        // 事务名称
        String getName();
        // 事务传播行为
        int getPropagationBehavior();
        // 事务隔离级别
        int getIsolationLevel();
        // 事务超时时长
        int getTimeout();
        // 事务是否只读
        boolean isReadOnly();
}

4.事务状态

public interface TransactionStatus extends SavepointManager, Flushable {
        // 是否新事务
        boolean isNewTransaction();
        // 是否有安全点
        boolean hasSavepoint();
        // 标记为rollback-only
        void setRollbackOnly();
        // 是否为rollback-only
        boolean isRollbackOnly();
        // 是否已经完成
        boolean isCompleted();
}

5. spirng事务传播行为

方法即行为,事务传播行为即授予方法何种事务行为。

  • PROPAGATION_REQUIRED
    执行到当前方法,如果存在事务,则作为当前事务的操作执行;否则,新建一个事务并执行。
  • PROPAGATION_SUPPORTS
    执行到当前方法,如果存在事务,则作为当前事务的操作执行;否则,以非事务的方式执行。
  • PROPAGATION_MANDATORY
    执行到当前方法,如果存在事务,则作为当前事务的操作执行;否则,抛出异常。
  • PROPAGATION_REQUIRES_NEW
    执行到当前方法,如果存在事务,则挂起当前事务,然后新建一个事务并执行,新建的事务和挂起的事务不存在提交等待和失败回滚依赖,相互独立;否则,新建一个事务并执行。
  • PROPAGATION_NOT_SUPPORTED
    执行到当前方法,如果存在事务,则挂起当前事务,然后以非事务的方式执行;否则,以非事务的方式执行。
  • PROPAGATION_NEVER
    执行到当前方法,如果存在事务,则抛出异常;否则,以非事务的方式执行。
  • PROPAGATION_NESTED
    类似 PROPAGATION_REQUIRES_NEW ,区别是新建的事务和挂起的事务存在提交等待和失败回滚依赖,共进退。

6. spirng事务管理

public interface PlatformTransactionManager {
        // 接收TransactionDefinition对象 返回TransactionStatus对象
        TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
        // 提交
        void commit(TransactionStatus status) throws TransactionException;
        // 回滚
        void rollback(TransactionStatus status) throws TransactionException;
}