注意: 除非是一个实际的事务开始,否则传播级别和超时时间的设置将不会生效.只有
PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED
可以触发, 所以通常在其他场景下指定这些配置是没有意义的. 此外, 注意不是所有事务管理器都会支持这些先进的特性, 因此, 当给定了非默认的值时,可能会有相应的异常抛出.
传播级别
PROPAGATION_REQUIRED
支持当前事务,如果当前不存在事务,则创建一个新的事务.通常这是事务定义的默认设置,通常定义一个事务同步的范围.
PROPAGATION_SUPPORTS
支持当前事务,如果当前不存在事务,则以非事务的方法执行.对于有事务同步的事务管理器来说PROPAGATION_SUPPORTS 与没有事务根本上来说有细微的不同,因为PROPAGATION_SUPPORTS定义了一个同步适用的范围.一般情况下, 谨慎使用PROPAGATION_SUPPORTS! 特别是, 在一个PROPAGATION_SUPPORTS范围内, 不要依赖PROPAGATION_REQUIRED或者PROPAGATION_REQUIRES_NEW(可能导致在运行时的同步冲突). 如果这样的嵌套是不可避免的, 请确保合适地配置你的事务管理器(通常转换成在实际事务中同步)
PROPAGATION_MANDATORY
支持当前事务,如果当前不存在事务则抛出异常. 注意: PROPAGATION_MANDATORY范围的事务同步总是被它的外围事务驱动着.
PROPAGATION_REQUIRES_NEW
创建一个新事务如果当前事务存在,暂停当前的事务. 注意: 实际事务暂停在所有的事务管理器上不会开箱即用的工作. PROPAGATION_REQUIRES_NEW范围总是定义它自己的事务同步. 现有的同步会被适时地暂停和恢复.
PROPAGATION_NOT_SUPPORTED
不支持当前的事务,总是非事务性的执行.
PROPAGATION_NEVER
不支持当前事务,如果当前存在事务,则抛出异常
PROPAGATION_NESTED
如果当前事务存在,执行一个嵌套事务,否则像PROPAGATION_REQUIRED一样执行.
隔离级别
ISOLATION_DEFAULT
使用 底层存储的默认隔离级别(对应JDBC的隔离级别)
ISOLATION_READ_UNCOMMITTED
脏读,不可重复读,幻读可以发生
该级别允许某条记录被一个事务改变,改变被提交之前,而被另一个事务读取(脏读).如果改变被回滚,第二个事务(读事务)将得到一个无效记录.
ISOLATION_READ_COMMITTED
脏读被阻止,不可重复读和幻读仍然存在
ISOLATION_REPEATABLE_READ
脏读和不可重复读被阻止,幻读仍然存在
ISOLATION_SERIALIZABLE
脏读,不可重复读,幻读都被阻止