知识大全 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的事务

在Spring中配置Hibernate的事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文

知识大全 在Spring中配置Hibernate事务(图)

在Spring中配置Hibernate事务(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Spring中IoC的入门实例详解

Spring中IoC的入门实例详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Spring的

知识大全 详解Spring中bean的scope

详解Spring中bean的scope  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何使用s

知识大全 在spring中有几种事务管理,分别是什么?

代码管理的事务处理TransactonTemplate的execute方法中的内部类TransactionCallback中的doInTransaction方法中使用publicvoidmake()?

知识大全 ASP.NET中Page.Ispostback属性详解

ASP.NET中Page.Ispostback属性详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 Spring的事务

Spring的事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天对spring的AOP事务

知识大全 Spring声明式事务管理源码解读之事务提交

Spring声明式事务管理源码解读之事务提交  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  其实

知识大全 Spring声明式事务管理源码解读之事务开始

Spring声明式事务管理源码解读之事务开始  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在s

知识大全 Spring 事务管理

Spring事务管理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据库事务是由一系列的动作组