事务的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
,还需要把PlatformTransactionManager
的nestedTransactionAllowed
(默认值为False
)设为True
。
</p>