探讨--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都不被修改。
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都不被修改。
- 探讨--SPRING下的事务管理与控制
- Spring框架下的事务管理
- Spring控制的事务管理的异常处理
- Hibernate与Spring的事务管理
- Spring的事务管理与回滚
- spring的@transactional与mysql事务管理
- 用Spring来控制事务管理
- Spring , Spring的事务管理
- Spring事务管理与数据库连接
- Spring与EJB事务管理
- spring与jdbc事务管理
- Spring事务管理与数据库连接
- Spring与事务管理
- Spring与JDBC,事务管理
- Spring JdbcTemplate 与 事务管理
- MySQL与Spring事务管理
- Spring事务管理一:Spring事务管理的优点
- Spring 对 JDBC 的支持与Spring 中的事务管理
- 根据调试信息学习jbpm(一):jbpmConfiguration
- JbpmServiceFactory与JbpmServices
- Fujitsu announces Interstage Business Process Manager 7铪铪
- C#中字符串的加密
- 企业解决方案平台(ESP)概念
- 探讨--SPRING下的事务管理与控制
- BEA WebLogic Integration 8.1试用感觉
- 转贴 为什么我们总是比别人钱少
- 防止SQL注入
- 三大主流工作流引擎技术分析与市场预测
- Flash插入代码
- oracle的bug(包括10G)
- jbpm3的Variable的类型处理
- jbpm解析流程定义的三种方式