美文网首页
Spring事务管理详解(1)--基础知识

Spring事务管理详解(1)--基础知识

作者: JonahCui | 来源:发表于2017-03-17 14:59 被阅读0次

    事务的ACID

    • 原子性(Atomic): 事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败
    • 一致性(Consistent): 事务结束后系统状态是一致的;
    • 隔离性(Isolated): 并发执行的事务彼此无法看到对方的中间状态
    • 持久性(Durable): 事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据

    2 基础类TransactionDefinition

    2.1 事务基本属性的定义

    2.1.1 事务的传播行为--PropagationBehavior

    <p>事务的传播行为是指一个事务如何运行,是在一个事务中运行,还是在一个非事务中运行,或者说挂起当前事务等,Spring中定义了7种行为,如下:


        PROPAGATION_REQUIRED: Support a current transaction; create a new one if none exists. 如果存在一个事务,则支持当前事务。如果没有事务,则开启一个新的事务。
            例如:

            A,B两个方法,A中调用了B,并且全开启事务,单独调用B会开启一个新事务
            单独调用A会为A创建一个事务,并且将B加入到该事务中。


        PROPAGATION_SUPPORTS: Support a current transaction; execute non-transactionally if none exists. 如果存在一个事务,则加入当前事务。如果没有,则不在事务中执行。

            例如:

            A,B两个方法,A中调用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_SUPPORTS
            如果单独调用B不会开启事务
            单独调用A则会开启一个事务并将B加入到该事务当中。
    PROPAGATION_MANDATORY: Support a current transaction; throw an exception if no current transaction exists. 如果存在一个事务,则加入到当前事务。如果没有,则抛出异常。
    例如:
    A,B两个方法,A中调用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_MANDATORY
    如果单独调用B抛出异常 IllegalTransactionStateException
    如果调用A,则开启一个新事务,并将B加入到该事务
    PROPAGATION_REQUIRES_NEW: Create a new transaction, suspending the current transaction if one exists. 创建一个新事务,如果当前事务已存在,则挂起当前事务。
    A,B两个方法,A中调用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_REQUIRES_NEW
    如果单独调用B,则为B创建一个新事务
    如果调用A,则开启一个新事务,将A的事务挂起,为B创建一个新事务
    注意:需要JtaTransactionManager事务管理器
    PROPAGATION_NOT_SUPPORTED: Do not support a current transaction; rather always execute non-transactionally. 总是非事务的执行,如果当前存在一个事务,则挂起当前事务。
    A,B两个方法,A中调用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_NOT_SUPPORTED
    如果单独调用B,非事务运行
    如果调用A,则开启一个新事务,将A的事务挂起,非事务运行B
    注意:需要JtaTransactionManager事务管理器
    PROPAGATION_NEVER: Do not support a current transaction; throw an exception if a current transaction exists. 总是非事务的执行,如果存在一个事务,则抛出异常
    A,B两个方法,A中调用了B,A--PROPAGATION_REQUIRED, B--PROPAGATION_NOT_SUPPORTED
    如果单独调用B,非事务运行
    如果调用A,则开启一个新事务,将A的事务挂起,运行B时抛出异常
    PROPAGATION_NESTED: Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. 如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动的事务,则按照PROPAGATION_REQUIRED执行。当使用jdbc3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器,需要JDBC驱动的java.sql.SavePoint类。有一些JTA的事务管理器实现可能也提供了同样的功能。
    使用PROPAGATION_NESTED,还需要把PlatformTransactionManagernestedTransactionAllowed(默认值为False)设为True
    </p>

    相关文章

      网友评论

          本文标题:Spring事务管理详解(1)--基础知识

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