springboot事务传递机制有哪些
时间: 2023-04-04 22:04:39 浏览: 103
SpringBoot 事务传递机制有以下几种:
1. REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
3. MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
4. REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起该事务。
5. NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则挂起该事务。
6. NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
希望能够帮到您。
相关问题
Springboot中 事务的传递机制?在A方法的事务中如何在调用B方法中并开启一个新的事务?
在Spring Boot中,事务的传递依赖于`@Transactional`注解以及Spring AOP(Aspect Oriented Programming)的特性。默认情况下,如果一个方法在@Transactional注解下,那么在该方法内部对数据库的操作都将处于相同的事务中。如果你想在A方法的事务中调用B方法并开启新的事务,可以考虑以下策略:
1. **传播行为(Propagation Behavior)**:
`@Transactional(propagation = Propagation.REQUIRES_NEW)` 可以设置为"新"(Requires New),这会强制在当前事务之外开启一个新的嵌套事务,A方法的事务不会影响到B方法的行为。
2. **事务切面(Transaction Aspect)**:
你可以编写一个自定义的切面,使用`@Before("execution(* com.example.service..*.*(..))")`这样的切入点表达式,在调用B方法之前通过`proceed()`方法开始一个新的事务。
3. **事务隔离级别**:
如果你不确定是否需要完全独立的新事务,也可以选择一个较低的隔离级别,如读未提交(Read Uncommitted),但这通常不是推荐做法,因为它可能导致数据不一致。
例子代码:
```java
@Service
public class MyService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA() {
// 这里操作A的数据,事务已经开始
// 调用B方法
doSomethingInB();
}
private void doSomethingInB() {
@Transactional
serviceB.methodB(); // 开启一个新的事务处理B方法
}
}
```
在这种情况下,`methodA`中的事务会在调用`doSomethingInB()`后立即结束,然后在`methodB`中开启新的事务。
springboot的事务传播机制应该如何使用
在Spring Boot中,事务传播机制是用来控制事务执行的范围和传递行为的,从而保证数据的一致性和完整性。可以使用以下几种传播行为:
1. REQUIRED:默认传播行为,如果外层有事务,就加入该事务,如果外层没有事务,则新开一个事务
2. SUPPORTS:如果外层有事务,就加入该事务,如果外层没有事务,则以非事务的方式执行
3. MANDATORY:必须在一个已有的事务中执行,否则会抛出异常
4. REQUIRES_NEW:挂起当前事务,开启一个新的事务,执行完后再恢复之前的事务
5. NOT_SUPPORTED:以非事务的方式执行,如果外层有事务,就挂起该事务
6. NEVER:以非事务的方式执行,如果外层有事务,则抛出异常
7. NESTED:在外层事务中开启一个嵌套事务,如果外层事务提交,则该事务也会提交,如果外层事务回滚,则该事务也会回滚
根据具体情况选择合适的传播行为可以更加灵活地控制事务的执行。
阅读全文