Spring对事务的支持

简介

springMVC中对事务的支持是通过在service层的类上标注 @Transactional实现的。

在标注时有两个参数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;
    如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与REQUIRED类似的操作。
I am chris, and what about you?
原文地址:https://www.cnblogs.com/arax/p/8463400.html