原子性(atomicity):强调事务的不可分割;
一致性(consistency):事务的执行先后数据的完整性保持一致;
隔离性(isolation):一个事务的执行的过程当中,不该该受到其余事务的干扰;
持久性(durability):事务一旦结束,数据就持久到数据库。数据库
DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别;
未提交读(read uncommited):脏读,不可重复读,虚读都有可能发生
已提交读(read commited):避免脏读。可是不可重复读和虚读都有可能发生;
可重复读(repeatable read):避免脏读和不可重复读,可是虚读有可能发生;
串行化的(serializable):避免以上全部读问题。
MySQL默认:可重复读
Oracle默认:已提交读安全
read uncommitted:是最低读事务隔离级别,它容许另一个事务能够看到这个事务未提交读数据。
read commited: 保证一个事务提交后才能被另一个事务读取。另一个事务不能读取该事务未提交的数据。
repeatable read:这种事务隔离级别能够防止脏读,不可重复读。可是可能会出现幻想读。它除了保证一个事务不能被另一个事务读取未提交读数据以外还避免了一下状况产生(不可重复读)。
serializable:这是花费最高代价但最可靠但事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读以外,还避免了幻象读(避免三种)。atom
PROPAGION_XXX:事务的传播行为
* 保证同一个事务中
PROPAGATION_REQUIRED 若是存在一个事务,则支持当前事务。若是没有事务则开启一个新的事务。
PROPAGATION_SUPPORTS 若是存在一个事务,支持当前事务。若是没有事务,则非事务的执行。可是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少量不一样。
PROPAGATION_MANDATORY 若是已经存在一个事务,支持当前事务。若是没有一个活动的事务,则抛出异常。
* 保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 老是开启一个新的事务。若是一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED 老是非事务地执行,并挂起任何存在的事务。
PROPAGATION_NEVER 老是非事务地执行,若是存在一个活动事务,则抛出异常
PROPAGATION_NESTED 若是一个活动的事务存在,则运行在一个嵌套的事务中. 若是没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
spa
事务传播行为种类:blog
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
下表为事务传播行为类型接口
事务传播行为类型 | 说明 |
PROPAGATION_REQUIRED | 若是当前没有事务,就新建一个事务,若是已经存在一个事务中,加入到这个事务中。这是最多见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,若是当前没有事务,就以非事务方式执行。事务 |
PROPAGATION_MANDATORYci |
使用当前的事务,若是当前没有事务,就抛出异常。同步 |
PROPAGATION_REQUIRES_NEW | 新建事务,若是当前存在事务,把当前事务挂起。it |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,若是当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则执行与PROPAGATION_REQUIRED相似的操做。 |
当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,而且实现者须要支持保存点事务机制。