Spring 事务初识(1)2018-08-22

2018-08-22  本文已影响0人  Seetheworl_6675
一:事务的4个限定属性(ACID)

1、原子性(Atomic) :对数据的修改要么全部执行,要么全部不执行。
2、一致性(Consistent) :在事务执行前后,数据状态保持一致性。
3、隔离性(Isolated) :一个事务的处理不能影响另一个事务的处理。
4、持续性(Durable) :事务处理结束,其效果在数据库中持久化。

二:隔离性(Isolated)细分4个隔离级别:

1、读未提交(read uncommitted):一个事务可以读取另一个事2务没有提交的数据。存在脏读、不可重复读、幻读的问题。
2、读提交(Read Committed):一个事务的操作结果只有在该事务提交之后,另一个事务才能读取到。避免另脏读,存在不可重复读、幻读的问题。
3、可重复读(Repeatable Read):保证在一个事务中,对同一笔数据的读取结果是相同的。避免另脏读、不可重复读,存在幻读的问题。
4、序列化读(Serializable):所以的事务是按顺序执行的。

脏读、不可重复读、幻读:
脏读:一个事务读取了,另一个事务为提交的数据
不可重复读:一个事务内对同一笔数据的多次读取结果不同,不可重复读的重点是修改。
幻读:同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。幻读的重点在于新增或者删除 (数据条数变化)

三、Spring事务的主要接口:

PlatformTransactionManager:界定事务的边界

public interface PlatformTransactionManager {
    //获取事务
    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
    //提交
    void commit(TransactionStatus var1) throws TransactionException;
    //回滚
    void rollback(TransactionStatus var1) throws TransactionException;
}

TransactionDefinition:负责定义事务的相关属性

public interface TransactionDefinition {
    //获取事务传播类型
    int getPropagationBehavior();

    //获取事务隔离级别
    int getIsolationLevel();

    //获取事务超时时间
    int getTimeout();

    //事务的只读性
    boolean isReadOnly();

    //获取事务名称
    String getName();

}

TransactionStatus:事务开启之后后事务结束期间的事务状态

public interface TransactionStatus extends SavepointManager, Flushable {
  // 是否是新的事物
    boolean isNewTransaction();
    // 是否有恢复点
    boolean hasSavepoint();
    //标记回滚当前事务
    void setRollbackOnly();
    //判断当前事务是不是标记为回滚
    boolean isRollbackOnly();
    //刷新会话到数据库
    void flush();
    // 是否已完成
    boolean isCompleted();
}

四:事务属性:
事务的传播属性:

1、TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

2、TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

3、TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
不支持当前事务的情况:

4、TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。

5、TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。

6、TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
其他情况:

7、TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事务的隔离属性:

1、TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

2、TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

3、TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

4、TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

事务超时属性(一个事务允许执行的最长时间)

所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。

事务只读属性(对事物资源是否执行只读操作)

事务的只读属性是指,对事务性资源进行只读操作或者是读写操作。所谓事务性资源就是指那些被事务管理的资源,比如数据源、 JMS 资源,以及自定义的事务性资源等等。如果确定只对事务性资源进行只读操作,那么我们可以将事务标志为只读的,以提高事务处理的性能。在 TransactionDefinition 中以 boolean 类型来表示该事务是否只读。

上一篇下一篇

猜你喜欢

热点阅读