Spring本地事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring本地事务相关的知识,希望对你有一定的参考价值。

参考技术A 官方文档

该@Transactional注解的是,指定的接口,类或方法必须具有事务语义的元数据(例如,“调用该方法时启动一个全新的只读事务,悬浮剂任何现有的交易”)。

传播设置是 PROPAGATION_REQUIRED.
隔离级别是 ISOLATION_DEFAULT.
该事务是读写的。
事务超时默认为基础事务系统的默认超时,如果不支持超时,则默认为none。
任何RuntimeException触发器回滚,任何检查Exception都没有。

PROPAGATION_REQUIRED如果当前没有事务存在,则执行本地事务的本地事务,或者参与为更大范围定义的现有“外部”事务。这是同一线程内公共调用堆栈安排的一个很好的默认值(例如,委托给几个存储库方法的服务外观,其中所有底层资源都必须参与服务级别事务)。
当传播设置为时PROPAGATION_REQUIRED,将为应用设置的每个方法创建逻辑事务范围。每个这样的逻辑事务范围可以单独确定仅回滚状态,外部事务范围在逻辑上独立于内部事务范围。在标准PROPAGATION_REQUIRED行为的情况下,所有这些范围都映射到同一物理事务。因此,内部事务范围中的仅回滚标记集确实会影响外部事务实际提交的机会。

但是,在内部事务作用域设置仅回滚标记的情况下,外部事务尚未决定回滚本身,因此回滚(由内部事务作用域静默触发)是意外的。UnexpectedRollbackException在那一点上抛出相应的对应 物。这是预期的行为,因此事务的调用者永远不会被误导,假设在实际上没有执行提交。因此,如果内部事务(外部调用者不知道)以静默方式将事务标记为仅回滚,则外部调用者仍会调用commit。外部调用者需要接收一个UnexpectedRollbackException以清楚地表明已执行回滚。

PROPAGATION_REQUIRES_NEW与此相反PROPAGATION_REQUIRED,始终对每个受影响的事务范围使用独立的物理事务,从不参与外部范围的现有事务。在这样的安排中,底层资源事务是不同的,因此可以独立地提交或回滚,外部事务不受内部事务的回滚状态的影响,并且内部事务的锁在完成后立即释放。这样一个独立的内部事务也可以声明它自己的隔离级别,超时和只读设置,而不是继承外部事务的特性。

PROPAGATION_NESTED使用具有多个保存点的单个物理事务,它可以回滚到该事务。这种部分回滚允许内部事务作用域触发其作用域的回滚,外部事务能够继续物理事务,尽管已经回滚了一些操作。此设置通常映射到JDBC保存点,因此它仅适用于JDBC资源事务。见春天DataSourceTransactionManager。

理想操作:
The configured profiling aspect starts.
配置的性能分析方面开始。
The transactional advice executes.
事务建议执行。
The method on the advised object executes.
建议对象上的方法执行。
The transaction commits.
事务提交。
The profiling aspect reports the exact duration of the whole transactional method invocation.
概要分析方面报告整个事务方法调用的确切持续时间。

技术点:springboot + jdbc + test + maven
pom.xml添加如下

application.properties

Dao层

Server层

测试类

以上是关于Spring本地事务的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码事务管理:事务级操作监听回调

spring事务的传播特性

使用Spring管理数据库事务

Spring事务的来龙去脉

从本地事务到分布式事务到微服务下事务

Spring整合JMS——事务管理