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

事务的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事务 前言 这篇其实也要归纳到《常识》系列中,但这重点又...
    码农戏码阅读 10,205评论 2 59
  • Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,...
    EnigmaXXX阅读 3,838评论 0 0
  • 1. 关于事务 事务控制就是将一系列操作当成一个不可拆分的逻辑单元,保证这些操作要么都成功,要么都失败。在关系数据...
    七弦桐语阅读 7,911评论 0 14
  • 转自CSDN 原文链接 前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过B...
    低至一折起阅读 7,007评论 0 0
  • 夜深了 风起了 窗外的枝条在疯狂摇摆 打翻了我装满思念的心瓶 想你了 你在哪 滚烫的泪水在任性泗流 浸湿了那尚存你...
    童姥阅读 1,475评论 0 1