知识大全 Spring中事务的传播属性详解
Posted 知
篇首语:厌伴老儒烹瓠叶,强随举子踏槐花。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring中事务的传播属性详解相关的知识,希望对你有一定的参考价值。
Spring中事务的传播属性详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们用Spring时 很多时候都会用到他的声明式事务 简单的在配置文件中进行一些规则配置 利用Spring的AOP功能就能轻松搞定事务问题 这里面就涉及到一个事务的传播属性问题【Propagation】 他在TransactionDefinition接口中定义 有兴趣可以看看src 共有 种选项可用
PROPAGATION_REQUIRED 支持当前事务 如果当前没有事务 就新建一个事务 这是最常见的选择 PROPAGATION_SUPPORTS 支持当前事务 如果当前没有事务 就以非事务方式执行 PROPAGATION_MANDATORY 支持当前事务 如果当前没有事务 就抛出异常 PROPAGATION_REQUIRES_NEW 新建事务 如果当前存在事务 把当前事务挂起 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作 如果当前存在事务 就把当前事务挂起 PROPAGATION_NEVER 以非事务方式执行 如果当前存在事务 则抛出异常 PROPAGATION_NESTED 支持当前事务 新增Savepoint点 与当前事务同步提交或回滚 现在结合一个实例 应用以上各种传播属性来进行说明 首先声明两个bean ServiceA和ServiceB 其中ServiceB被引用
view plaincopy to clipboardprint? ServiceA
void methodA()
thodB();
ServiceB
void methodB()
//
ServiceA
void methodA()
thodB();
ServiceB
void methodB()
//
接下来 我们就一一分析下
PROPAGATION_REQUIRED 加入当前正要执行的事务不在另外一个事务里 那么就起一个新的事务 比如说 thodB的事务级别定义为PROPAGATION_REQUIRED 那么由于执行thodA的时候 thodA已经起了事务 这时调用thodB thodB看到自己已经运行在thodA 的事务内部 就不再起新的事务 而假如thodA运行的时候发现自己没有在事务中 他就会为自己分配一个事务 这样 在thodA或者在thodB内的任何地方出现异常 事务都会被回滚 即使thodB的事务已经被 提交 但是thodA在接下来fail要回滚 thodB也要回滚
PROPAGATION_SUPPORTS 如果当前在事务中 即以事务的形式运行 如果当前不再一个事务中 那么就以非事务的形式运行 PROPAGATION_MANDATORY 必须在一个事务中运行 也就是说 他只能被一个父事务调用 否则 他就要抛出异常 PROPAGATION_REQUIRES_NEW 比如我们设计thodA的事务级别为PROPAGATION_REQUIRED thodB的事务级别为PROPAGATION_REQUIRES_NEW 那么当执行到thodB的时候 thodA所在的事务就会挂起 thodB会起一个新的事务 等待thodB的事务完成以后 他才继续执行 他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了 因为thodB是新起一个事务 那么就是存在 两个不同的事务 如果thodB已经提交 那么thodA失败回滚 thodB是不会回滚的 如果thodB失败回滚 如果他抛出的异常被thodA捕获 thodA事务仍然可能提交 PROPAGATION_NOT_SUPPORTED 当前不支持事务 比如thodA的事务级别是PROPAGATION_REQUIRED 而thodB的事务级别是PROPAGATION_NOT_SUPPORTED 那么当执行到thodB时 thodA的事务挂起 而他以非事务的状态运行完 再继续thodA的事务 PROPAGATION_NEVER 不能在事务中运行 假设thodA的事务级别是PROPAGATION_REQUIRED 而thodB的事务级别是PROPAGATION_NEVER 那么thodB就要抛出异常了 PROPAGATION_NESTED 理解Nested的关键是savepoint 他与PROPAGATION_REQUIRES_NEW的区别是 PROPAGATION_REQUIRES_NEW另起一个事务 将会与他的父事务相互独立 而Nested的事务和他的父事务是相依的 他的提交是要等和他的父事务一块提交的 也就是说 如果父事务最后回滚 他也要回滚的 而Nested事务的好处也是他有一个savepoint view plaincopy to clipboardprint? ServiceA
void methodA()
try
thodB();
catch (Exception e)
// 执行其他业务
thodC();
ServiceA
void methodA()
try
thodB();
catch (Exception e)
// 执行其他业务
thodC();
cha138/Article/program/Java/ky/201311/28425
相关参考
在Spring中配置Hibernate的事务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本文
在Spring中配置Hibernate事务(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Spring中IoC的入门实例详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Spring的
详解Spring中bean的scope 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何使用s
代码管理的事务处理TransactonTemplate的execute方法中的内部类TransactionCallback中的doInTransaction方法中使用publicvoidmake()?
知识大全 ASP.NET中Page.Ispostback属性详解
ASP.NET中Page.Ispostback属性详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
Spring的事务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 今天对spring的AOP事务
Spring声明式事务管理源码解读之事务提交 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 其实
Spring声明式事务管理源码解读之事务开始 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在s
Spring事务管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据库事务是由一系列的动作组