###事务是允许你将多个操作组合成要么全部发生,要么全部不发生的工作单元,这些单元的特征是使用同一个connection,并且这些操作同时提交,同时回滚。
两个操作看是否在同一个事务中关键是看这两个操作十分使用同一个connection,接下来要考虑的就是让这个两个操作同时提交,所以需要将 autocommit set 为false。这样两个操作便是在同一个 事务了。
##1.事务最终还是要靠底层database的connection来实现的.
2.使用一个事务的目标是让几个操作要么一起提交,要么一起回滚.
3.要达到这个目标,本质上要让几个操作或Dao使用的是同一个data source,也就是同一个connection.
所以一个事务要控制多个操作,实际就是要让这些操作尽量使用同一个connection。
4.一个Hibernate session其实就是基于一个database connection 的,所以保证了多个操作在同一个Hibernate session就是保证了同一个database connection. 可以说Hibernate session和database connection是等同的.
5.在ssh, spring事务管理主要是通过对Hibernate session 进行控制管理,也就是说在多个Hibernate dao进行操作时,为了让他们在同一个事务下,那么就要保证他们使用同一个session。
个人觉得spring事务传播机制的使用主要考虑当前运行的方法是否需要使用当前的事务,也就是外部事务。如果需要使用外部事务,那么方法的内部事务和外部事务是什么样的关系,是否是同一个事务还是一个新的事务,如果是新的事务,它是怎么样和外面事务进行工作的。
http://kingj.iteye.com/blog/1461600
由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于:PROPAGATION_REQUIRES_NEW 将创建一个全新的事务,它和外层事务没有任何关系,而 PROPAGATION_NESTED 将创建一个依赖于外层事务的子事务,当外层事务提交或回滚时,子事务也会连带提交和回滚。
###1)转自http://nicholasbugs.iteye.com/blog/226901
Spring事务传播机制
PROPAGATION_REQUIRES_NEW starts a new, independent "inner" transaction for the given scope. This transaction will be committed or rolled back completely independent from the outer transaction, having its own isolation scope, its own set of locks, etc. The outer transaction will get suspended at the beginning of the inner one, and resumed once the inner one has completed.
PROPAGATION_REQUIRES_NEW会在当前运行的范围内创建一个全新的内部事务,这个的事务会独立地被提交或回滚(完全独立于外部事务),它拥有自己的隔离级别,以及锁等等。当内部事务被执行时,外部事务会被挂起,知道内部事务结束时才会继续执行。
Such independent inner transactions are for example used for id generation through manual sequences, where the access to the sequence table should happen in its own transactions, to keep the lock there as short as possible. The goal there is to avoid tying the sequence locks to the (potentially much longer running) outer transaction, with the sequence lock not getting released before completion of the outer transaction.
这种独立的内部事务会被诸如从序列生成ID的应用中,从序列取得id的动作应该发生在自己的事务内部,并且保持对这个sequence表的锁的时间越短越好。这么做是为了避免在获得ID以后可能仍然在很长时间内持有这个sequence表的锁(外部事务仍在运行中)。
PROPAGATION_NESTED on the other hand starts a "nested" transaction, which is a true subtransaction of the existing one. What will happen is that a savepoint will be taken at the start of the nested transaction. íf the nested transaction fails, we will roll back to that savepoint. The nested transaction is part of of the outer transaction, so it will only be committed at the end of of the outer transaction.
PROPAGATION_NESTED启动了一次嵌套的事务(一个当前事务的子事务),在内部嵌套事务开始时,会保留一个保存点(savepoint),如果内部嵌套事务失败,将会回滚到savepoint处,内部嵌套事务是外部事务的一部分,所以只有在外部事务完成时才会被提交。
Nested transactions essentially allow to try some execution subpaths as subtransactions: rolling back to the state at the beginning of the failed subpath, continuing with another subpath or with the main execution path there - all within one isolated transaction, and not losing any previous work done within the outer transaction.
嵌套事务可以满足子事务“多路执行”的需求:回滚到失败的内部嵌套事务开始的地方,然后执行另外的一个内部嵌套事务,或者继续执行主事务-上面提及的事务都是独立的,不会丢失外部事务所作的修改。
For example, consider parsing a very large input file consisting of account transfer blocks: The entire file should essentially be parsed within one transaction, with one single commit at the end. But if a block fails, its transfers need to be rolled back, writing a failure marker somewhere. You could either start over the entire transaction every time a block fails, remembering which blocks to skip - or you mark each block as a nested transaction, only rolling back that specific set of operations, keeping the previous work of the outer transaction. The latter is of course much more efficient, in particular when a block at the end of the file fails.
例如,分块传输一个很大的文件,整个文件的传输应该放在一个事务内部,在文件传输完成后提交事务。如果一个文件块传输失败了,就需要在某个地方写一个失败标记,然后重新传这个文件块,你可以在每次传输一个文件块失败时重新开始事务,然后记住那些块已经成功传输了,忽略即可-或者你可以把每个文件块的传输作为一个内部嵌套事务,只回滚失败的事务,保存前面事务的更改结果,当然这种方法要有效得多,想像一个最后一个文件块出错的情形。
PROPAGATION_REQUIRES_NEW会在当前运行的范围内创建一个全新的内部事务,这个的事务会独立地被提交或回滚(完全独立于外部事务),它拥有自己的隔离级别,以及锁等等。当内部事务被执行时,外部事务会被挂起,知道内部事务结束时才会继续执行。
Such independent inner transactions are for example used for id generation through manual sequences, where the access to the sequence table should happen in its own transactions, to keep the lock there as short as possible. The goal there is to avoid tying the sequence locks to the (potentially much longer running) outer transaction, with the sequence lock not getting released before completion of the outer transaction.
这种独立的内部事务会被诸如从序列生成ID的应用中,从序列取得id的动作应该发生在自己的事务内部,并且保持对这个sequence表的锁的时间越短越好。这么做是为了避免在获得ID以后可能仍然在很长时间内持有这个sequence表的锁(外部事务仍在运行中)。
PROPAGATION_NESTED on the other hand starts a "nested" transaction, which is a true subtransaction of the existing one. What will happen is that a savepoint will be taken at the start of the nested transaction. íf the nested transaction fails, we will roll back to that savepoint. The nested transaction is part of of the outer transaction, so it will only be committed at the end of of the outer transaction.
PROPAGATION_NESTED启动了一次嵌套的事务(一个当前事务的子事务),在内部嵌套事务开始时,会保留一个保存点(savepoint),如果内部嵌套事务失败,将会回滚到savepoint处,内部嵌套事务是外部事务的一部分,所以只有在外部事务完成时才会被提交。
Nested transactions essentially allow to try some execution subpaths as subtransactions: rolling back to the state at the beginning of the failed subpath, continuing with another subpath or with the main execution path there - all within one isolated transaction, and not losing any previous work done within the outer transaction.
嵌套事务可以满足子事务“多路执行”的需求:回滚到失败的内部嵌套事务开始的地方,然后执行另外的一个内部嵌套事务,或者继续执行主事务-上面提及的事务都是独立的,不会丢失外部事务所作的修改。
For example, consider parsing a very large input file consisting of account transfer blocks: The entire file should essentially be parsed within one transaction, with one single commit at the end. But if a block fails, its transfers need to be rolled back, writing a failure marker somewhere. You could either start over the entire transaction every time a block fails, remembering which blocks to skip - or you mark each block as a nested transaction, only rolling back that specific set of operations, keeping the previous work of the outer transaction. The latter is of course much more efficient, in particular when a block at the end of the file fails.
例如,分块传输一个很大的文件,整个文件的传输应该放在一个事务内部,在文件传输完成后提交事务。如果一个文件块传输失败了,就需要在某个地方写一个失败标记,然后重新传这个文件块,你可以在每次传输一个文件块失败时重新开始事务,然后记住那些块已经成功传输了,忽略即可-或者你可以把每个文件块的传输作为一个内部嵌套事务,只回滚失败的事务,保存前面事务的更改结果,当然这种方法要有效得多,想像一个最后一个文件块出错的情形。
相关推荐
在学习过程中,阅读博客如《spring hibernate 事务管理学习笔记(一)》是非常有益的,它通常会包含具体的示例代码和实践建议。你可以参考这个博客链接(https://microjava.iteye.com/blog/525973),结合实际项目,...
在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...
Spring.NET事务配置模板。 原文出处:http://www.cnblogs.com/GoodHelper/archive/2009/11/16/SpringNet_Transaction.html
在本篇“Spring.NET学习笔记16——事务管理Demo源码”中,我们将深入探讨Spring.NET的事务管理机制及其实际应用。 事务管理是软件开发中的关键部分,它确保数据库操作的一致性和完整性。Spring.NET通过其事务管理...
#### 一、Spring事务概述 在Spring框架中,事务管理是一项重要的功能,它能够确保业务操作的一致性和完整性。Spring提供了两种类型的事务管理:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过代码...
### Spring学习笔记知识点详解 #### 一、Spring框架概述 **1.1 什么是Spring** Spring框架是一个开源的轻量级应用框架,主要用于简化企业级应用程序的开发过程。它的核心特性在于提供了一种灵活的方式来组织和...
在本篇“spring学习笔记(十六)-声明式事务的例子”中,我们将深入探讨这一主题。 首先,声明式事务管理基于AOP(面向切面编程)实现,Spring通过代理模式在方法调用前后自动插入事务管理的代码。它主要通过两种方式...
### 学习笔记:尚硅谷Spring6基础篇 #### 一、Spring框架概述 ##### 1.1 Spring是什么? Spring是一款主流的Java EE轻量级开源框架,由“Spring之父”Rod Johnson提出并创立。Spring的主要目标是简化Java企业级...
在Spring框架中,事务管理是核心功能之一,它确保了数据的一致性和完整性。这篇"Spring学习笔记(18)-...这篇笔记详细阐述了Spring配置文件实现事务管理的方法,是初学者和进阶者理解Spring事务管理机制的重要参考资料。
在本篇Spring学习笔记中,我们将深入探讨Spring的几个关键知识点,包括其优点、AOP的实现原理以及声明式事务管理。 首先,Spring的优点在于它的轻量级特性,它不对现有类结构造成入侵,允许开发者专注于业务逻辑。...
标题中的“Spring技术内幕 学习笔记”表明这是一份关于深入理解Spring框架核心机制的资料集合,主要关注Spring框架的内部工作原理和高级用法。描述中的“NULL”没有提供额外信息,但我们可以通过标签“源码”和...
- **Spring事务管理**:Spring提供了一套完整的事务管理API,支持声明式事务管理和编程式事务管理两种方式。 - **持久化支持**:Spring支持多种持久化技术,如JDBC、Hibernate、iBatis等,并提供了统一的异常处理...
在本篇Spring学习笔记中,我们将探讨如何使用Spring框架的注解方式来管理事务,这是一种在现代Java应用中广泛采用的方法。Spring框架以其强大的依赖注入和面向切面编程能力,为事务管理提供了简洁且高效的解决方案。...
Spring事务的实现方式主要有编程式事务管理和声明式事务管理。编程式事务需要编写代码来管理事务边界,而声明式事务则通过XML配置或注解方式将事务管理与业务逻辑分离。Spring框架的事务管理有其优点,如统一的事务...
注解中还可以设置不同的属性,如propagation(事务传播行为)、isolation(隔离级别)、timeout(超时时间)和read-only(只读事务)等,以满足不同场景的需求。 例如,在一个简单的Spring MVC应用中,你可能会在...
2. 事务管理:Spring提供了一种声明式事务管理方式,无需编写复杂的事务传播代码。 3. 单例模式:Spring默认会将bean设置为单例模式,确保在整个应用中只有一个实例。 4. AOP支持:Spring的面向切面编程允许开发者...
7. 事件传播Spring 提供了一个事件发布和订阅机制,允许 Bean 之间进行异步通信。通过实现 `ApplicationListener` 接口并注册到容器,一个 Bean 可以订阅特定的事件并在事件触发时接收通知。 8. Spring 的模块化...
本笔记主要探讨Spring的三个关键特性:IOC(控制反转)、AOP(面向切面编程)以及事务传播。 首先,Spring的核心特性之一是IOC(Inversion of Control),也被称为依赖注入。IOC通过反转对象的创建和管理权,使得...