一、Propagation (事务的传播属性)
Propagation : key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
1: PROPAGATION_REQUIRED
加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,
ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA
的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。
这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被
提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚
2: PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
3: PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常
4: PROPAGATION_REQUIRES_NEW
这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,
那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,
他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在
两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,
如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
5: PROPAGATION_NOT_SUPPORTED
当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,
那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。
6: PROPAGATION_NEVER
不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,
那么ServiceB.methodB就要抛出异常了。
7: PROPAGATION_NESTED
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而Nested事务的好处是他有一个savepoint。
*****************************************
ServiceA {
/**
* 事务属性配置为 PROPAGATION_REQUIRED
*/
void methodA() {
try {
//savepoint
ServiceB.methodB(); //PROPAGATION_NESTED 级别
} catch (SomeException) {
// 执行其他业务, 如 ServiceC.methodC();
}
}
}
********************************************
也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如
ServiceC.methodC,继续执行,来尝试完成自己的事务。
但是这个事务并没有在EJB标准中定义。
Spring事务的隔离级别
1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
除了防止脏读,不可重复读外,还避免了幻像读。
什么是脏数据,脏读,不可重复读,幻觉读?
脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,
另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一
个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。
那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据
可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及
到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,
以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
另附
表 9.1. <tx:method/> 有关的设置
属性 | 是否需要? | 默认值 | 描述 |
name | 是 | 与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。 如:'get*'、'handle*'、'on*Event'等等。 | |
propagation | 不 | REQUIRED | 事务传播行为 |
isolation | 不 | DEFAULT | 事务隔离级别 |
timeout | 不 | -1 | 事务超时的时间(以秒为单位) |
read-only | 不 | false | 事务是否只读? |
rollback-for | 不 | 将被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException' | |
no-rollback-for | 不 | 不 被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException |
相关推荐
综上所述,理解并熟练掌握Spring的事务管理机制,包括传播特性、隔离级别和readonly属性,对于开发高效、稳定的业务系统至关重要。正确配置和使用这些特性,能有效防止并发控制中的异常情况,保障数据的完整性和一致...
事务传播特性&事务隔离级别 事务传播特性是指在 Java 中,事务的传播行为,即在多个...事务传播特性和事务隔离级别是 Java 中事务管理的两个重要方面,需要深入了解和正确使用,以确保事务的正确执行和数据的一致性。
### Spring 事务隔离和传播机制详解 #### 一、Spring 事务传播机制 Spring 的事务管理功能非常强大,其中一个重要特性就是事务传播行为。事务传播行为定义了当一个方法调用另一个方法时,如何处理事务边界的问题。...
总之,“Spring事物传播测试表”是学习和掌握Spring事务管理的重要工具。通过对各种传播行为的测试和分析,开发者能够更好地理解Spring事务的运作机制,从而在实际项目中编写出更加健壮和可靠的代码。在实际工作中,...
### Spring事务的七大传播行为 ...总结来说,选择合适的事务传播行为和隔离级别对于确保应用程序的数据一致性至关重要。开发者需要根据业务需求权衡性能和数据一致性之间的关系,以选择最合适的设置。
事务的隔离级别和传播行为是理解Spring事务管理的关键概念。以下是对这两个主题的详细解释: 首先,我们来看看Spring支持的五个事务隔离级别: 1. **DEFAULT**:这是PlatformTransactionManager的默认隔离级别,它...
Spring允许我们为每个数据源配置单独的事务管理器,这样可以独立控制各自的事务行为,如隔离级别、传播行为等。 接着,我们来看Spring的多事务处理。在有多个数据源的情况下,Spring支持同时管理多个事务。这意味着...
而Spring_Hibernate_2可能涉及具体事务传播特性的实例代码或者进一步的事务控制策略,如回滚规则和隔离级别设置。 在实际开发中,合理地利用Spring的事务管理和传播特性,能够有效地提高代码的可维护性和系统的稳定...
这里的`@Transactional`会告诉Spring如何处理方法内部的事务,包括传播行为、隔离级别、超时和回滚规则等。 3. **基于XML的声明式事务管理(Declarative Transaction Management via XML)** - 在XML配置文件中,...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。...在实际项目中,根据具体需求,你可能还需要调整事务的传播行为、隔离级别、回滚规则等属性,以满足复杂的应用场景。
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...
【Spring 事务底层原理分析】 在软件开发中,Spring 框架提供了强大的事务管理功能,使得开发者...在实际项目中,根据业务场景合理配置事务隔离级别和传播行为,可以有效地防止并发问题,保证数据的一致性和完整性。
`TransactionDefinition` 接口用于定义事务的特性,包括传播行为、隔离级别、超时设置和只读标志。传播行为定义了当一个事务方法被另一个事务方法调用时,如何处理事务边界。例如,`PROPAGATION_REQUIRED` 表示如果...
在配置文件中声明事务属性,如事务的传播行为、隔离级别、超时时间、是否回滚等,然后在方法上添加@Transactional注解,Spring会在背后自动进行事务管理。这种方式降低了代码耦合,使事务管理更加集中,易于维护。 ...
2. **TransactionDefinition**: 定义了事务的属性,如隔离级别、传播行为、超时和是否只读。例如,`PROPAGATION_REQUIRED`是默认的传播行为,表示如果当前存在事务,则加入该事务;如果不存在,则创建一个新的事务。...
总结起来,"spring-控制事物回滚"涵盖的知识点包括Spring的声明式事务管理、事务的回滚规则、传播行为、隔离级别以及源码分析和相关工具的使用。理解和掌握这些内容,对于提升Java企业级应用开发的能力至关重要。
- **基于注解的配置**:使用`@Transactional`注解在类或方法级别声明事务属性,如传播行为、隔离级别、超时时间等。 5. **事务的传播行为** - REQUIRED(默认):如果当前存在事务,则加入该事务;如果不存在,则...
此外,事务还有隔离级别,包括READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE,它们定义了事务间的并发控制策略,防止脏读、不可重复读和幻读等问题。 在实际开发中,我们通常使用Spring的AOP...
2. **第三种方法:基于XML的声明式事务管理**:这种方式通过XML配置文件来指定事务的传播行为、隔离级别等。使用`<tx:advice>`和`<aop:config>`等标签。 - **特点**:配置更加直观,易于理解。 - **适用场景**:...