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

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都不被修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值