spring如何传播事务
-
Spring框架提供了多种方式来传播事务。事务传播是指当一个方法调用另一个方法时,前一个方法执行的事务如何传播给后一个方法。
-
REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播级别。这种传播级别适用于大部分情况。
-
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式执行。这种传播级别适用于对事务没有强制要求的操作,例如只读操作。
-
MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。这种传播级别适用于必须在事务中执行的操作,如果没有事务,会抛出异常。
-
REQUIRES_NEW:每次都创建一个新的事务,并挂起当前事务(如果有的话)。这种传播级别适用于需要独立于外部事务执行的操作。
-
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起该事务。这种传播级别适用于对事务没有影响的操作,例如不需要回滚的操作。
-
NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。这种传播级别适用于禁止在事务中执行的操作。
-
NESTED:如果当前存在事务,则在当前事务的嵌套事务中执行。如果当前没有事务,则创建一个新的事务。嵌套事务可以独立于外部事务进行提交或回滚,但是它依赖于外部事务的完全提交或回滚。如果外部事务回滚,嵌套事务也会回滚。
在Spring中,事务传播可以通过使用@Transactional注解或xml配置来设置。可以在方法级别或类级别上添加@Transactional注解来设置事务传播级别。或者在xml配置文件中使用tx:advice和tx:attributes元素来配置事务传播。
总结:Spring框架提供了丰富的事务传播级别选项,可以根据不同的场景选择适合的传播级别来管理事务的传播。
1年前 -
-
Spring框架中的事务是通过使用@Transactional注解来传播的。事务传播是指当一个方法调用包含在另一个方法中时,如何处理事务。Spring框架提供了不同的事务传播行为选项,可以根据需要选择适合的传播行为。
以下是Spring框架中事务传播的几种常见的方式:
-
REQUIRED: 默认的传播行为,如果存在一个事务,则支持当前事务,如果不存在事务,则开启一个新的事务。这是最常用的传播行为,适合大多数的业务场景。
-
SUPPORTS: 如果存在一个事务,则支持当前事务;如果不存在事务,则以非事务方式执行。适用于不需要强制统一事务的场景,可以减少事务开销。
-
MANDATORY: 如果存在一个事务,则支持当前事务,如果不存在事务,则抛出异常。适用于特定的业务场景,要求存在外部事务。
-
REQUIRES_NEW: 总是开启一个新的事务,如果存在一个事务,则将当前事务挂起。适用于在一个方法中需要启动一个新事务,而不受调用方法的事务影响的场景。
-
NOT_SUPPORTED: 总是以非事务方式执行操作,如果存在一个事务,则将当前事务挂起。适用于不需要事务支持的场景,可以提高性能。
在Spring中,可以将@Transactional注解应用在方法级别或类级别上。方法级别的优先级高于类级别,即方法级别的@Transactional注解会覆盖类级别的注解。
此外,Spring还支持设置事务的只读属性(readOnly),只读事务可以优化性能并减少锁的竞争。在只读事务中,不允许对数据进行修改操作,仅允许查询操作。
总结起来,Spring提供了灵活且强大的事务管理功能,可以根据业务需求选择合适的事务传播行为来保证数据的一致性和完整性。通过@Transactional注解,可以轻松地管理和控制事务的传播。
1年前 -
-
Spring提供了丰富的事务管理功能,其中就包括了事务的传播行为的配置。事务的传播行为定义了一个事务方法执行时,其如何与已经存在的事务交互。Spring的事务传播行为分为多种类型,每种类型都对应着一种不同的事务传播策略。
下面将介绍Spring中常用的事务传播行为及其使用方法。
- REQUIRED(默认)
REQUIRED表示当前方法必须在一个事务中运行,如果当前存在一个事务,就加入到这个事务中。如果不存在事务,就创建一个新事务。
//@Transactional注解的默认propagation属性值为Propagation.REQUIRED @Transactional public void transactionA() { // do something }- SUPPORTS
SUPPORTS表示当前方法不要求在一个事务中运行,如果已经有一个事务在运行,就在这个事务中执行;如果没有事务,则直接以非事务的方式执行。
@Transactional(propagation = Propagation.SUPPORTS) public void transactionB() { // do something }- MANDATORY
MANDATORY表示当前方法必须在一个事务中运行,如果当前不存在事务,则抛出异常。
@Transactional(propagation = Propagation.MANDATORY) public void transactionC() { // do something }- REQUIRES_NEW
REQUIRES_NEW表示当前方法必须运行在它自己的事务中,如果当前存在事务,则将当前事务挂起。可以理解为子事务的方式。
@Transactional(propagation = Propagation.REQUIRES_NEW) public void transactionD() { // do something }- NOT_SUPPORTED
NOT_SUPPORTED表示当前方法不应该在事务中运行,如果有一个事务在运行,则将其挂起。
@Transactional(propagation = Propagation.NOT_SUPPORTED) public void transactionE() { // do something }- NEVER
NEVER表示当前方法不应该在一个事务中运行,如果存在一个事务,则抛出异常。
@Transactional(propagation = Propagation.NEVER) public void transactionF() { // do something }- NESTED
NESTED表示当前方法必须运行在一个嵌套的事务中,如果没有事务,则创建一个新事务;如果存在一个事务,则在嵌套的事务中执行。
@Transactional(propagation = Propagation.NESTED) public void transactionG() { // do something }以上就是Spring中常用的事务传播行为及其使用方法。根据业务需求选择合适的传播行为可以提高事务的灵活性和效率。
1年前 - REQUIRED(默认)