Spring中的事务及数据库事务的关系

一、MySQL中的事务

如果对MySQL中的事务不了解的话,请先看 基于MySQL 8.0 对事务的深度理解

二、Spring中的事务

  1. Spring管理事务的方式

    1. 编程式事务
      编程式事务就是利用手动代码编写事务相关的业务逻辑,这种方式比较复杂、啰嗦,但是更加灵活可控制。

    2. 声明式事务
      其实包括xml配置和注解的使用方式。

      xml形如下:

        <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes>  <!--设置所有匹配的方法,然后设置传播级别和事务隔离--><tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="merge*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="put*" propagation="REQUIRED" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="count*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="list*" propagation="SUPPORTS" read-only="true" /> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="txPointcut" expression="execution(* org.transaction..service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> </aop:config>
      

      注解形如下:

      <tx:annotation-driven transaction-manager="transactionManager" /><!--开启注解的方式-->
      

      @transaction注解可以放在方法上或者类上

  2. Spring事务传播行为

    1. 含义

      Spring管理的事务是逻辑事务,而且物理事务和逻辑事务最大差别就在于事务传播行为,
      事务传播行为用于指定在多个事务方法间调用时,事务是如何在这些方法间传播的。下面解结合例子加伪代码的方式进行讲解。

    2. Required

      必须有逻辑事务,否则新建一个事务。
      使用PROPAGATION_REQUIRED指定,表示如果当前存在一个逻辑事务,则加入该逻辑事务。否则将新建一个逻辑事务,如下图所示。

      按照required传播行为的逻辑,代码执行的逻辑如下:

      • 在调用userService对象的insert方法时,此方法用的是Required传播行为且
        此时Spring事务管理器发现还没开启逻辑事务,因此Spring管理器会开启逻辑事务。
      • 在此逻辑事务中调用了accountService对象的insert方法,而在insert方法中发现同样用的是Required传播行为,
        因此直接使用该已经存在的逻辑事务。
      • 返回userService,执行完并关闭事务。

      这种情况下,两个事务属于同一个事务,一个回滚则两个任务都回滚。

    3. RequiresNew

      每次都会创建新的逻辑事务。使用PROPAGATION_REQUIRES_NEW指定,表示每次都创建新的逻辑事务(物理事务也是不同的)如下图所示。

      这种情况下,两个事务是独立的,一个回滚则并不会影响另外一个事务。

    4. Supports

      支持当前事务,使用PROPAGATION_SUPPORTS指定,指如果当前存在逻辑事务,就加入到该逻辑事务。
      如果当前没有逻辑事务,就以非事务方式执行,如下图所示。

      一句话就是有事务就加入,没有就按照没有事务的方式执行。

    5. NotSupported

      不支持事务,如果当前存在事务则暂停该事务。使用PROPAGATION_NOT_SUPPORTED指定,即以非事务方式执行,如果当前存在逻辑事务,就把当前事务暂停,以非事务方式执行。

      一句话以非事务的方式,如果有事务,就把事务关闭。

    6. Mandatory

      必须有事务,否则抛出异常。
      使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出异常(IllegalTransactionStateException)。
      当运行在存在逻辑事务中则以当前事务运行,如果没有运行在事务中,则抛出异常。

    7. Never

      不支持事务。如果当前存在是事务则抛出异常,使用PROPAGATION_NEVER指定。
      即以非事务方式执行,如果当前存在事务,则抛出异常(IllegalTransactionStateException)

    8. Nested

      嵌套事务支持。使用PROPAGATION_NESTED指定。
      如果当前存在事务,则在嵌套事务内执行;如果当前不存在事务,则创建一个新的事务。
      嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚。

      Nested和RequiresNew的区别:

      • RequiresNew每次都创建新的独立的物理事务,而Nested只有一个物理事务;
      • Nested嵌套事务回滚或提交不会导致外部事务回滚或提交,但外部事务回滚将导致嵌套事务回滚,而 RequiresNew由于都是全新的事务,所以之间是无关联的;
      • Nested使用JDBC 3的保存点(save point)实现,即如果使用低版本驱动将导致不支持嵌套事务;
      • 使用嵌套事务,必须确保具体事务管理器实现的nestedTransactionAllowed属性为true,
        否则不支持嵌套事务,如DataSourceTransactionManager默认支持,而HibernateTransactionManager默认不支持,需要设置来开启。

三、项目中的使用

项目中针对增删改操作一般使用Required级别。对针对查询使用Support或NotSupport.
其他的传播行为用的比较少。

Spring中的事务及数据库事务的关系相关推荐

  1. Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别

    Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别 AOP:面向切面编程. 即在一个功能模块中新增其他功能,比方说你要下楼取个快递,你同事对你说 ...

  2. Spring中两种编程式事务管理

    Spring中两种编程式事务管理 在代码中显示调用beginTransaction,commit,rollback等与事务处理相关的方法,这就是编程式事务管理,当只有少数事务操作时,编程式事务管理才比 ...

  3. channelfuture怎么拿到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  4. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  5. 在Spring中使用JOTM实现JTA事务管理

    Spring 通过AOP技术可以让我们在脱离EJB的情况下享受声明式事务的丰盛大餐,脱离Java EE应用服务器使用声明式事务的道路已经畅通无阻.但是很大部分人都还认为脱离Java EE应用服务器就无 ...

  6. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  7. mysql 事务serializable_数据库事务级别TRANSACTION_SERIALIZABLE

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...

  8. Spring中DispacherServlet与WebApplicationContext、ServletContext的关系和工作机制

    解释一: 要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的 ...

  9. Spring中DispacherServlet、WebApplicationContext、ServletContext的关系

    解释一: 要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的 ...

最新文章

  1. 合理消费你的86400秒
  2. hdu3336 KMP + DP 前缀数组出现的次数
  3. [SpringMVC]定义多个前缀映射的问题
  4. CSS扩展“less和”sass“
  5. poj 3264 Balanced Lineup RMQ问题 线段树
  6. 学完计算机还是不懂,如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧...
  7. 安卓APP_ 控件(3)—— EditText
  8. throw和throws的使用
  9. NTT Docomo研究主管Kazuaki OBANA:NTT DOCOMO NFV案例解析
  10. Unity3D播放ogv格式的视频
  11. 计算机伦理学理论分析三大思想,医学伦理学的基本理论
  12. 使用JS取得焦点(focus)元素
  13. coco数据集分割可视化格式转换
  14. iOS 图形处理 Core Graphics Quartz2D 教程
  15. Java体系十大组织
  16. 4x root 红米_红米4X root教程_红米4X卡刷root包来获取root权限的方法
  17. Vue中视频组件vue-video-player
  18. Scalar类-颜色类
  19. 博士毕业年龄如何计算机,紧缺专业博士因年龄问题,毕业等于失业(转载)
  20. Neo4j中的OGM(Object Graph Mapping)类似于ORM(对象关系映射)

热门文章

  1. JAVA快速排序过程图解(10步之内看懂)
  2. pyqt5+feapder+mysql简单爬取newrank的数据。
  3. 重型仓库货架十大排行榜 2022年物流仓储重型货架品牌推荐
  4. 如何编写弹出窗口不被IE阻止的程序
  5. 机器学习中的线性代数知识(中)
  6. 癌症出气筒,释放内心的爱与痛
  7. 期权卖方风险大为什么会有人愿意做,因为卖方的胜率容易盈利
  8. python经纬度数据可视化_geopandas地图数据可视化
  9. HDU 1005 — Number Sequence
  10. win 10系统安装myeclipse 9.1 破解问题