美文网首页
Spring 事务初识(1)2018-08-22

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

作者: Seetheworl_6675 | 来源:发表于2018-08-22 23:08 被阅读0次
    一:事务的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 类型来表示该事务是否只读。

    相关文章

      网友评论

          本文标题:Spring 事务初识(1)2018-08-22

          本文链接:https://www.haomeiwen.com/subject/pufuiftx.html