简介
springMVC中对事务的支持是通过在service层的类上标注 @Transactiona
实现的。
在标注时有两个参数isolation和propagation。下面对这两个参数做具体介绍。
isolation 事务隔离级别
springmvc在 org.springframework.transaction.annotation.Isolation 定义了事务的隔离级别。
- DEFAULT
使用底层数据库默认的事务隔离级别。 - READ_UNCOMMITTED
这个事务隔离级别会导致脏读,不可重复读和幻读。因为它允许一个事务读取另一个事务中未提交的数据(有变化)。如果未提交的数据出现任何回滚,第二个事务将会获取一个无效的数据。
不可重复读:同一事务两次读取数据可能以为另一个事务对该数据的修改而不一致。
幻读:一个事务修改了表中的所有数据,同时另一个事务又向表中插入一行数据,在某个时刻,第一事务发现表中还有没有修改的数据行。 - READ_COMMITTED
这个事务隔离级别可以阻止脏读,但是还存在不可重复读,幻读现象。该事务级别不允许一个事务读取另一个事务中未提交的数据。 - REPEATABLE_READ
这个事务级别不会导致脏读和重复读,幻读仍然存在,他不但阻止一个事务读取另一个书屋中没有提交的数据,他还阻止一个事务在读取一个数据行时,另一个事务对该行进行修改。 - SERIALIZABLE
这个事务级别可以阻止脏读,不可重复读,和幻读。包含Repeatable_read的所有的禁止情况,而且他还阻止如果一个事务在处理满足一定where条件的行记录时,不允许另一个事务插入一个满足where条件的记录。
propagation 事务传播行为
org.springframework.transaction.annotation.Propagation中定义了事务的传播行为。
- REQUIRED
支持当前事务,如果当前没有事务就创建一个。 - SUPPORTS
支持当前事务,如果当前没有事务就以非事务方式执行。 - MANDATORY
支持当前事务,如果当前没有事务则抛出异常。 - REQUIRES_NEW
新建事务,如果当前存在事务,将当前事务挂起。 - NOT_SUPPORTED
不支持事务,如果当前存在事务,则将当前事务挂起。 - NEVER
以非事务方式运行,如果当前存在事务,则抛出异常。 - NESTED;
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。