探讨--SPRING下的事务管理与控制

来源:互联网 发布:大数据预处理 编辑:程序博客网 时间:2024/06/07 01:17
SPRING的事务管理中常见如下配置:
PROPAGATION_REQUIRED
   -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS
   -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
   -- 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
   -- 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
  -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
  -- 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
  -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

除了PROPAGATION_NESTED和PROPAGATION_REQUIRES_NEW不好区分外,其他都可以根据字面意思就能理解清楚,就不多累述了,主要还是讲解下PROPAGATION_NESTED和PROPAGATION_REQUIRES_NEW的区别。

PROPAGATION_REQUIRES_NEW:如果当前存在事务,就把当前事务事务挂起,开启一个新的事务,等当前事务结束后,继续原来的事务。
PROPAGATION_NESTED :是一个嵌套事务,如果外围没有事务,就开启一个新的事务,这种情况下同PROPAGATION_REQUIRED。对于嵌套的事务,同最关键的是,PROPAGATION_NESTED引入了savepoint ,嵌套事务开始执行时,它将取得一个savepoint,如果这个嵌套事务失败,则回到这个savepoint,继续执行外部事务,只有外部事务结束后,嵌套的事务才会被提交。

见下面的代码说明:

PROPAGATION_REQUIRES_NEW
1.
A.begin();
update(1);
    B.begin();
    upate(2);
    B.rollback();//(or commit fail);
update(3);
A.commit();//假设成功,则结果为1,3被修改,2不被修改


1.
A.begin();
update(1);
    B.begin();
    upate(2);
    B.commit();
update(3);
A.rollback();//假设成功,则结果为2被修改,1,3不被修改


PROPAGATION_NESTED :

1.parent.begin();
update(1);
child = parent.createChild();
child.begin();
update(2);
child.rollback() (or commit but fail);
update(3);
parent.commit();//假设成功,则结果为1,3被修改,2不被修改


3.parent.begin();
update(1);
child = parent.createChild();
child.begin();
update(2);
child.commit(); //假设成功
update(3);
parent.rollback() (or commit but fail);//结果为1,2,3都不被修改


3.parent.begin();
update(1);
child = parent.createChild();
child.begin();
update(2)
child.commit(); //假设成功
update(3)

parent.rollback(); //结果为1,2,3都不被修改。