事物传播行为介绍:
@Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
事物超时设置:
@Transactional(timeout=30) //默认是30秒
事务隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE):串行化
MYSQL: 默认为REPEATABLE_READ级别
SQLSERVER: 默认为READ_COMMITTED
Transactional propagation默认传播行为值是
1.默认require:当有新的事务部开启,加入之前事务。
https://blog.csdn.net/kiwi_coder/article/details/20214939
1.1 @Transactional A, @Transactional B,如果A调用B,B抛异常throw,B会记录rollback,A正常接受把异常继续抛出,这时整个Transactional会回滚。
在commit时spring会判断回滚标志,若检测到存在回滚标记, 则回滚事务并抛出UnexpectedRollbackException异常,客户端会收到500。
1.2 如果此时B抛异常throw,B会记录rollback,但A捕获try catch住,这里A是正常运行了(没有标记rollback),此时A和B在一事务里没有一致性,前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException,不能回滚,程序正常的退出。
1.3 如果用require_new,A和B相互独立事物,互不影响。
1.4 如果A不加@Transactional,而B加@Transactional,此时A和B都不会生成事务。
https://www.cnblogs.com/milton/p/6046699.html
第一,在私有方法上加事务注解无效,B如果是私有方法,无效, 未回滚。
第二,普通接口方法A直接调用同类带事务的方法B, 无效, 未回滚,通过接口调用则有效。
@Override
public void txnInOpenPublicByInvokePublic() {
//txnInOpenPublic(); // 无效
testCase01.txnInOpenPublic(); // 有效
}
1.5 在接口方法B上加事务, 再被他类的接口方法A调用, 无论此接口方法是否加事务, 都有效。
总结: Transactional是否生效, 仅取决于是否加载于接口方法, 并且是否通过接口方法调用(而不是本类调用)
通过动态代理,在代理类里,先开启事务,执行任务,成功则提交事务,异常则回滚事务,最后关闭事务。
也可以是require_new:如果有新事务挂起之前事务,然开启新事务。
分享到:
相关推荐
在Spring框架中,`@Transactional`注解是用于标记事务管理的重要工具,它使得开发者能够方便地在代码中声明式地控制事务的...通过实例分析和源码阅读,我们可以更深入地理解Spring事务管理机制,提升我们的编程技能。
以下是对`jdbc+spring+mysql事务理解和分析`的详细说明: 1. **原子性(Atomicity)**:这是事务的基本特性,表示事务中的所有操作要么全部成功,要么全部回滚。如果在事务执行过程中发生错误,数据库会撤销所有已...
Spring声明式事务是Java开发中不可或缺的一部分,它利用Spring的AOP(面向切面编程)和代理机制,为开发者提供...通过源码分析和实践应用,开发者可以更好地理解和掌握这一强大的特性,提升自己的Java企业级开发能力。
Spring 源代码分析系列涵盖了多个关键模块,包括事务处理、IoC容器、JDBC、MVC、AOP以及与Hibernate和Acegi安全框架的集成。以下是对这些知识点的详细阐述: 1. **Spring 事务处理**:Spring 提供了声明式事务管理...
本篇主要聚焦于Spring 3.0版本中的注解配置和XML配置的实践,通过分析提供的文件名,我们可以深入探讨三个关键知识点:Spring与Hibernate的事务管理、注解配置的事务管理和AOP的注解配置。 首先,让我们关注"Spring...
在"druid-demo"这个项目中,通过分析源码,我们可以学习到如何处理这些问题,确保@Transactional注解在遇到异常时能够正确地管理事务。 最后,通过这个示例,我们可以深入理解Java、MyBatis、SpringMVC和Druid的...
在源码分析中,我们可以看到当一个方法被@Transactional标记后,Spring会创建一个代理,这个代理在目标方法执行前后插入事务管理逻辑。在方法开始前,如果满足事务启动条件,就会调用`PlatformTransactionManager`的...
在这个源码中,我们可以深入理解Spring如何处理事务的生命周期、回滚规则以及与各种数据源的集成。 首先,`spring-tx`模块主要包含以下几个关键组件: 1. **PlatformTransactionManager**: 这是Spring事务管理的...
通常,这样的文件可能包含有关Spring事务管理的示例数据、测试用例或其他相关分析。 总结来说,Spring的声明式事务管理通过注解简化了事务的处理,让开发者可以专注于业务逻辑,而无需过多关注事务的细节。理解并...
7. **案例分析**:"SPRING事务管理案例分析.docx"很可能包含了具体的项目实例,详细讲解了如何在Spring项目中配置和使用事务管理,以及如何解决实践中遇到的问题。而"studyspring"可能是源代码目录,包含了实现这些...
本篇文章将深入探讨Spring框架的工作原理和代码分析,帮助你更好地理解和掌握其精髓。 1. **依赖注入(DI)**: - DI是Spring的核心特性,它允许对象之间的依赖关系在运行时通过配置文件或注解来管理,而不是硬...
当你在业务层的方法上添加`@Transactional`,Spring会自动为该方法开启一个事务,并在方法执行完毕后根据返回结果决定提交还是回滚事务。例如: ```java @Service public class UserService { @Transactional ...
- **问题分析**:当一个带有`@Transactional`注解的方法被声明为`final`时,Spring AOP无法对其进行动态代理,因为`final`方法不能被代理类所覆盖。 - **示例代码**: ```java @Service public class ...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...
本文将深入探讨Spring与Hibernate整合时的事务管理,帮助你更好地理解和运用这些技术。 首先,Spring框架是Java企业级应用的基石,它提供了一种依赖注入(Dependency Injection,DI)的方式,使得组件之间的耦合度...
以上只是Spring源码分析的部分内容,实际源码中还包括Spring的其他模块,如Spring Batch(批处理)、Spring Security(安全)、Spring Integration(集成)等。理解并掌握Spring源码,有助于我们更好地利用Spring...
Spring框架是Java开发中最常用的轻量级框架之一,它的核心特性包括依赖注入(Dependency Injection,DI)和面向切面编程...通过分析和实践这个项目,开发者可以深入理解Spring的工作原理,并能熟练运用到实际开发中。
通过上述分析,我们可以看到,"Spring事务不起作用"的问题涉及到多个层面,包括代码、配置和理解。解决这类问题需要从各个角度排查,确保每个环节都符合Spring事务管理的要求。对于具体的代码问题,建议参考官方文档...
在源码中,你可以看到Spring如何通过AOP代理来拦截@Transactional方法,以及如何与底层的数据访问技术交互来控制事务。 在分析源码时,建议先理解每个组件的作用,然后逐步深入到具体类的实现。例如,从...
总的来说,深入分析Spring框架的源代码,能够帮助我们理解其设计思想和实现原理,从而在实际开发中更好地利用这些功能。同时,这也有助于我们学习和掌握Java面向对象设计原则,以及如何通过模块化和解耦来构建复杂...