spring事务如何传递
-
Spring事务传递是指当一个事务方法A调用另一个事务方法B时,事务如何在两个方法之间传递和管理的。当方法B被方法A调用时,事务可以选择传播给方法B,或者方法B创建一个新的事务来执行。
在Spring中,事务传递的默认行为是REQUIRED(需要)传播行为。这意味着被调用的方法如果在一个事务中被调用,它将在该事务中运行。如果没有事务存在,方法将为自己创建一个新的事务。
除了REQUIRED传播行为外,Spring还提供了其他几种传播行为:
-
REQUIRED_NEW(需要新的):被调用的方法将在一个新的事务中执行,如果此时有一个事务存在,则将该事务挂起。
-
SUPPORTS(支持):被调用的方法将使用当前的事务,如果没有事务存在,方法将在非事务状态下执行。
-
NOT_SUPPORTED(不支持):被调用的方法将在非事务状态下执行,如果有一个事务存在,将挂起该事务。
-
MANDATORY(强制):被调用的方法必须在一个事务中执行,如果没有事务存在,则会抛出异常。
-
NEVER(从不):被调用的方法必须在非事务状态下执行,如果有一个事务存在,则会抛出异常。
-
NESTED(嵌套):被调用的方法将在一个嵌套的事务中执行,该事务是父事务的一部分。如果没有父事务存在,NestED将与REQUIRED传播行为一样。
以上是常用的事务传播行为,可以根据实际情况选择合适的行为。对于方法调用的事务传播行为的选择,可以通过在方法上使用
@Transactional注解来指定。此外,Spring还提供了编程式的事务传播设置方法,可以在代码中进行手动设置。1年前 -
-
Spring事务的传递性是指当多个方法通过调用关系相互调用时,事务如何在这些方法之间传递和管理。Spring提供了多种传递事务的方式,以下是几种常见的传递性方式:
-
PROPAGATION_REQUIRED (默认):
当一个方法被调用时,如果调用者已经存在一个事务,那么被调用方法将在该事务内执行,如果调用者没有事务,则被调用方法将会创建一个新的事务。 -
PROPAGATION_REQUIRES_NEW:
当一个方法被调用时,该方法将创建一个新的事务并独立执行,即使调用者存在事务,被调用方法也不会与之共享。 -
PROPAGATION_NESTED:
当一个方法被调用时,如果调用者存在事务,被调用方法将在该事务的嵌套事务中执行,嵌套事务可以独立进行提交或回滚,如果调用者没有事务,则被调用方法将创建一个新的事务。 -
PROPAGATION_SUPPORTS:
当一个方法被调用时,如果调用者存在事务,被调用方法将在该事务内执行,如果调用者没有事务,则被调用方法将以非事务方式执行。 -
PROPAGATION_NOT_SUPPORTED:
当一个方法被调用时,如果调用者存在事务,被调用方法将挂起该事务并以非事务方式执行,如果调用者没有事务,则被调用方法以非事务方式执行。
在Spring中,可以使用@Transactional注解来指定事务的传递行为。例如:
@Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void method2() { // 业务逻辑 }在上述示例中,当method1()中的业务逻辑执行时,如果method1()被调用者存在一个事务,method2()会在该事务内执行;如果method1()被调用者没有事务,method2()将创建一个新的事务并独立执行。
通过合理地使用事务传递性,可以确保多个方法在一个事务内执行,保证数据的一致性和完整性。但是需要注意的是,事务传递性可能会引起死锁和性能问题,因此需要根据实际业务需求和场景选择合适的传递性。
1年前 -
-
Spring事务的传递性是指一个事务是否可以在多个方法调用中进行传递。在Spring中,事务的传递性是通过TransactionTemplate或@Transactional注解来实现的。
1.使用TransactionTemplate传递事务
TransactionTemplate是Spring提供的一个便捷的事务管理类,它提供了一种编程式的事务管理方式。下面是一个示例代码,演示了如何使用TransactionTemplate传递事务。@Autowired private TransactionTemplate transactionTemplate; public void methodA() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // 在这里执行事务相关的操作 methodB(); } }); } public void methodB() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // 在这里执行事务相关的操作 } }); }在上面的例子中,methodA()、methodB()都使用了transactionTemplate.execute的方式来执行事务。当methodA()调用methodB()时,事务会自动传递到methodB(),并形成一个嵌套的事务。如果任意一个方法执行失败,事务会回滚,否则事务会提交。
2.使用@Transactional注解传递事务
@Transactional是Spring提供的一种声明式事务管理方式,通过在方法上添加该注解来实现事务的管理。下面是一个示例代码,演示了如何使用@Transactional注解传递事务。@Transactional public void methodA() { // 在这里执行事务相关的操作 methodB(); } @Transactional public void methodB() { // 在这里执行事务相关的操作 }在上面的例子中,当methodA()调用methodB()时,事务会自动传递到methodB(),并形成一个嵌套的事务。如果任意一个方法执行失败,事务会回滚,否则事务会提交。
3.事务传播行为
在Spring中,事务的传播行为(Propagation)是用来指定事务在多个方法调用中的传播方式。Spring提供了多种事务传播行为的选择,包括REQUIRED、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED等。在使用@Transactional注解时,可以通过设置propagation属性来指定事务的传播方式。- REQUIRED:如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。
- REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。
- SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式执行。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。
例如:
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // 在这里执行事务相关的操作 methodB(); } @Transactional(propagation = Propagation.REQUIRED) public void methodB() { // 在这里执行事务相关的操作 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodC() { // 在这里执行事务相关的操作 }在上面的例子中,methodA()、methodB()使用的事务传播行为是REQUIRED,同一个事务;而methodC()使用的事务传播行为是REQUIRES_NEW,创建了一个新的事务。所以当methodA()调用methodB()时,事务会传递;当methodA()调用methodC()时,会挂起当前事务并启动一个新的事务。
总结:
Spring事务的传递性通过TransactionTemplate或@Transactional注解实现。可以使用TransactionTemplate提供的编程式事务管理方式来传递事务;也可以使用@Transactional注解提供的声明式事务管理方式来传递事务。同时,可以通过设置propagation属性来指定事务的传播行为。1年前