一. TransactionDefinition接口中定义了五个不同的事务隔离级别

 

1. ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应

2. ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。(未提交读 UR)

 

3. ISOLATION_READ_COMMITTED  保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 (游标稳定性 CS

4. ISOLATION_REPEATABLE_READ  这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。(读稳定性 RS)

 

5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。(不可重复读 RR)

 

隔离级别

存取未落实数据

重复读

幻想读

读稳定性 RS

不可能

不可能

不可能

读稳定性 RS

不可能

不可能

可能

游标稳定性 CS

不可能

可能

可能

未提交读 UR

可能

可能

可能

DEFAULT

数据库默认的事务隔离级别

 

 

 

二. 在TransactionDefinition接口中定义了七个事务传播行为

 

PROPAGATION_REQUIRED = 0 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

 

PROPAGATION_REQUIRES_NEW = 3 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

 

PROPAGATION_SUPPORTS = 1  如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。

 

PROPAGATION_NOT_SUPPORTED = 4  总是非事务地执行,并挂起任何存在的事务。

 

PROPAGATION_MANDATORY = 2 -- 支持当前事务,如果当前没有事务,就抛出异常。

 

PROPAGATION_NEVER = 5  总是非事务地执行,如果存在一个活动事务,则抛出异常

 

PROPAGATION_NESTED = 6 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

 

PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:它们非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA事务管理器的支持。
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED时,需要JDBC 3.0以上驱动及1.4以上的JDK版本支持。其它的JTA TrasactionManager实现可能有不同的支持方式。



PROPAGATION_REQUIRES_NEW 完全是一个新的事务 , 而 PROPAGATION_NESTED 则是外部事务的子事务

PROPAGATION_REQUIRED应该是我们首先的事务传播行为。它能够满足我们大多数的事务需求。