事务浅识

1. Spring定义事务属性几种方式

  • 事务的传播行为(Propagation Behavisor)
    • required: 支持当前事务,如果当前没有事务,就新建一个事务(默认)

    • supports: 支持当前事务,如果当前没有事务,就以非事务方式执行

    • mandatory: 支持当前事务,如果当前没有事务,就抛出异常

    • requires_new: 新建事务,如果当前存在事务,把当前事务挂起

    • not_supported: 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

    • never: 以非事务方式执行,如果当前存在事务,则抛出异常

    • nested: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

  • 事务的隔离级别(Isolation)

  • 事务的超时时间(Timeout)

  • 是否为只读事务(ReadOnly)

2. Dao or Service配置事务

Spring事务为业务逻辑进行事务管理,保证业务逻辑上数据的原子性。

事务得根据项目性质来细分:事务可以设置到三个层面(dao层、service层和web层)。

  • web层事务,这一般是针对那些安全性要求较高的系统来说的。例如电子商务网站。粒度小,一般系统用不着这么细

  • service层事务,这是一常见的事务划分, 将事务设置在业务逻辑上,只要业务逻辑出错或异常就事务回滚。粒度较小,一般推荐这种方式

  • 数据持久层数据务,也就是常说的数据库事务。这种事务在安全性方面要求低。就是给一个简单的增删改之类的操作增加事务操作。粒度大

给Service层配置事务,因为一个Service层方法操作可以关联到多个DAO的操作。在Service层执行这些Dao操作,多DAO操作有失败全部回滚,成功则全部提交。

Dao层数据访问层,是不应该包含业务逻辑的,这就是和Service层的不同;Service层就是业务逻辑层,事务的管理就是为Service层上的保证。

3. 事务传播

事务传播指service方法调用另一个service方式时,被调用方法的事务行为。

这种行为分为两种调用方式来区分:

  • service内部方法间调用:被调用方法设定的事务行为将会失效,事务行为由最外层方法设置的事务行为控制

  • 一个service调用另一个service的方法:当两个service方法不属于同一个事务时,被调用方法出现的异常时不会导致外部方法事务回滚,但会使外部方法执行出现异常(可选择是否捕获);如果是属于同一个事务,外部方法捕获异常将会导致被调用方法不回滚。

Written on November 28, 2015