美文网首页spring
Spring 事务机制详解

Spring 事务机制详解

作者: 简_easy | 来源:发表于2018-07-31 14:45 被阅读56次

    Spring事务机制主要包括声明式事务和编程式事务

    Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。

    Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事务管理的核心接口。

    public interface TransactionDefinition { 

       int getPropagationBehavior();//返回事务的传播行为。 

       int getIsolationLevel();//返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以     看到本事务内的哪些数据。 

       int getTimeout();//返回事务必须在多少秒内完成。 

       boolean isReadOnly();//事务是否只读,事务管理器能够根据这个返回值进行优化,确保事     务是只读的。 

    }

    1. TransactionDefinition接口中定义五个隔离级别:

    ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应;

    ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

    ISOLATION_READ_COMMITTED  保证事务A提交后 事务B才可以读取。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

    ISOLATION_REPEATABLE_READ  这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

    ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

    名词解释:

    Dirty reads(脏读): 事务B读了事务A还没有提交的数据 然而事务A失败了

     non-repeatable reads(数据不可重复读):事务A前后两次读取数据之间事务B修改了此数据,导致两次读取不一致。 

     phantom reads(幻象读数据):事务A前后两次读取数据集之间事务B改变了此数据集条件字段的值 导致取出的数据不一致。

    2. 在TransactionDefinition接口中定义了七个事务传播行为:

    (1)PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

    (2)PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

    (3)PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

    (4)PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

    (5)PROPAGATION_NOT_SUPPORTED  总是非事务地执行,并挂起任何存在的事务。

    (6)PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常;

    (7)PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。《这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。需要JDBC 驱动的java.sql.Savepoint类。有一些JTA的事务管理器实现可能也提供了同样的功能。使用PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true;而nestedTransactionAllowed属性值默认为false;》

    嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

    相关文章

      网友评论

        本文标题:Spring 事务机制详解

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