2016-1-27
关于Spring嵌套事务
spring 事务
PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行.
另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务, 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交.
由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 潜套事务也会被 commit, 这个规则同样适用于 roll back.
1. 我们要设置 transactionManager 的 nestedTransactionAllowed 属性为 true, 注意, 此属性默认为 false!!!
JdbcTransactionObjectSupport 告诉我们必须要满足两个条件才能 createSavepoint :
2. java.sql.Savepoint 必须存在, 即 jdk 版本要 1.4+
3. Connection.getMetaData().supportsSavepoints() 必须为 true, 即 jdbc drive 必须支持 JDBC 3.0
确保以上条件都满足后, 你就可以尝试使用 PROPAGATION_NESTED 了
引用详情-->此处
相关推荐
- `NESTED`:如果当前存在事务,则在嵌套事务内运行;如果没有事务,则行为类似于`REQUIRED`。 Spring事务管理的隔离级别包括: - `DEFAULT`:使用数据库的默认隔离级别。 - `READ_UNCOMMITTED`:最低隔离级别,...
嵌套事务允许独立于外部事务的回滚,但在外部事务回滚时,嵌套事务也会回滚。 #### 五、总结 通过上述分析,我们可以看出Spring中的事务传播行为提供了丰富的选项,可以帮助开发者精确地控制事务的执行逻辑。正确...
springboot mybatis多数据源加事务嵌套 事务之间的调用 回滚 亲测可用 定义2个库分别建立 CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) ...
在了解嵌套事务之前,可以先看下单个事务在 Spring 中的处理流程,以便后面可以更清晰地认识嵌套事务的逻辑。Spring 事务使用 AOP 的机制实现,会在@Transactional 注解修饰的方法前后分别织入开启事务的逻辑,以及...
4. **嵌套事务的深度**:理论上,你可以无限嵌套事务,但实际应用中应避免过深的嵌套,因为它可能导致性能问题,并增加代码的复杂性。 5. **事务隔离级别**:Nested事务继承了父事务的隔离级别,所以不需要额外设置...
7. **PROPAGATION_NESTED**:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则行为类似PROPAGATION_REQUIRED。 在`springTranscationDemo`中,我们可能会看到如何通过设置不同的传播行为来控制事务的...
7. **PROPAGATION_NESTED**:如果当前存在活动事务,则在嵌套事务中运行;如果没有活动事务,则按`PROPAGATION_REQUIRED`执行。这种传播行为仅对`DataSourceTransactionManager`有效。 #### 三、数据库隔离级别 ...
Spring事务实践 事务锁 嵌套事务设计原理
通过代码解析spring传播特性,包括 ... 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么...
- NESTED:如果当前存在事务,则在嵌套事务内执行;若无,则按REQUIRED行为处理。 #### 2.3 事务隔离级别 事务隔离级别是指并发事务间如何共享数据。Spring支持五种隔离级别: - READ_UNCOMMITTED:最低级别,可能...
这些传播行为可以帮助我们处理嵌套事务和其他复杂的事务场景。 另外,事务的隔离级别也是需要考虑的重要因素。Spring支持四种隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,它们...
7. **PROPAGATION_NESTED**:如果当前存在事务,则在一个嵌套事务内执行;如果不存在,则行为与PROPAGATION_REQUIRED相同。 在"Spring事务传播Demo"中,我们可能看到如何在不同传播行为下,一个事务方法被另一个...
NEW(新建事务,如果已存在则挂起)、NOT_SUPPORTED(不支持事务,如果存在则挂起)、NEVER(永不运行在事务中)、NESTED(如果存在事务,则在嵌套事务内运行,否则新建)。 - 超时(timeout):定义事务可以运行的...
7. NESTED:如果当前存在事务,则在嵌套事务内执行;如果不存在,则按REQUIRED行为执行。 接下来,我们讨论事务的隔离级别。这是防止并发问题的关键策略,主要有以下四种: 1. READ_UNCOMMITTED:最低级别的隔离,...
如果当前存在事务,则暂停)、NOT_SUPPORTED(总是运行在非事务上下文中,如果当前存在事务,则暂停)、NEVER(如果当前存在事务,则抛出异常)、NESTED(如果当前存在事务,则创建一个嵌套事务;如果不存在,则按照...
嵌套事务可以实现细粒度的事务控制,尤其是在需要回滚部分操作而不影响整个事务时。 #### 二、Spring事务的隔离级别(Isolation) 事务的隔离级别定义了事务之间相互隔离的程度,从而影响事务的一致性。Spring支持四...
- `NESTED`:如果当前存在事务,则在一个嵌套事务内执行;如果没有事务,则按`REQUIRED`行为执行。 4. **事务的隔离级别** - `READ_UNCOMMITTED`:最低级别,可能导致脏读、不可重复读和幻读。 - `READ_...
- NESTED:如果当前存在事务,则创建一个嵌套事务;否则行为同REQUIRED。 理解并熟练掌握Spring声明式事务处理是每个Spring开发者必备的技能。正确地配置和使用事务管理能确保应用在处理复杂业务逻辑时保持数据的...