spring中事务如何进行传播
-
在Spring中,事务传播是指事务在不同方法之间的传递和管理。事务传播规定了一个方法调用其他方法时,事务如何在这些方法之间传播和处理。
Spring中定义了七种事务传播行为,分别是:
-
REQUIRED(默认):当前方法必须运行在事务中,如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务。
-
SUPPORTS:当前方法不需要运行在事务中,如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式运行。
-
MANDATORY:当前方法必须运行在事务中,如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常。
-
REQUIRES_NEW:当前方法必须运行在一个新的事务中,如果当前存在事务,则挂起该事务,并创建一个新的事务;如果不存在事务,则新建一个事务。
-
NOT_SUPPORTED:当前方法不需要运行在事务中,如果当前存在事务,则挂起该事务,并以非事务方式运行;如果不存在事务,则以非事务方式运行。
-
NEVER:当前方法不能运行在事务中,如果当前存在事务,则抛出异常;如果不存在事务,则以非事务方式运行。
-
NESTED:当前方法必须运行在一个具有保存点的嵌套事务中,如果当前存在事务,则在当前事务的保存点上创建一个嵌套事务;如果不存在事务,则新建一个嵌套事务。
事务传播行为可以通过@Transactional注解或XML配置来设置。通常情况下,我们可以在Service层使用@Transactional注解来定义事务传播行为。例如:
@Transactional(propagation = Propagation.REQUIRED) public void methodA(){ // ... } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodB(){ // ... }在上面的例子中,methodA()使用了REQUIRED传播行为,当methodA()方法被调用时,如果当前存在事务,则methodA()将加入该事务;如果不存在事务,则会新建一个事务。methodB()使用了REQUIRES_NEW传播行为,无论当前是否存在事务,methodB()都会新建一个事务来运行。
总之,Spring提供了灵活的事务管理机制,通过事务传播行为可以灵活地控制事务的传递和处理方式,使得我们可以更加方便地管理和使用事务。
1年前 -
-
Spring中事务的传播行为是通过@Transactional注解来定义的。事务的传播行为决定了如果一个事务方法被另一个事务方法调用时,应该如何处理事务。
- REQUIRED(默认):如果当前存在一个事务,则加入该事务,如果不存在事务,则创建一个新的事务。
例如:
@Transactional
public void methodA() {
// 事务开始
// …
methodB();
// …
// 事务结束
}
@Transactional
public void methodB() {
// methodB的业务逻辑
}- REQUIRES_NEW:每次都创建一个新的事务,如果当前存在一个事务,先将当前事务挂起。
例如:
@Transactional
public void methodA() {
// 事务开始
// …
methodB();
// …
// 事务结束
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// methodB的业务逻辑
}- SUPPORTS:如果当前存在一个事务,则加入该事务,如果不存在事务,则以非事务的方式执行。
例如:
@Transactional
public void methodA() {
// 事务开始
// …
methodB();
// …
// 事务结束
}
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// methodB的业务逻辑
}- NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在一个事务,先将当前事务挂起。
例如:
@Transactional
public void methodA() {
// 事务开始
// …
methodB();
// …
// 事务结束
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
// methodB的业务逻辑
}- MANDATORY:如果当前存在一个事务,则加入该事务,如果不存在事务,则抛出异常。
例如:
@Transactional
public void methodA() {
// 事务开始
// …
methodB();
// …
// 事务结束
}
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// methodB的业务逻辑
}除了上述提到的几种传播行为外,Spring还提供了其他的传播行为如NEVER、NESTED等,开发者可以根据具体的需求选择适合的传播行为来定义事务的行为。同时,也可以通过@Transactional注解的其他属性来配置事务的隔离级别、只读属性、异常回滚规则等。
1年前 - REQUIRED(默认):如果当前存在一个事务,则加入该事务,如果不存在事务,则创建一个新的事务。
-
Spring中事务的传播行为是通过使用@Transactional注解或者编程式事务管理来实现的。事务的传播行为指的是当一个方法被调用时,如何处理方法内部的事务。
Spring定义了多种事务传播行为,包括:- REQUIRED:如果当前没有事务,就创建一个新事务,如果已经存在一个事务中,加入到这个事务中。
- SUPPORTS:如果当前存在事务,就加入到这个事务中,如果当前没有事务,就以非事务的方式执行。
- MANDATORY:如果当前存在事务,就加入到这个事务中,如果当前没有事务,就抛出异常。
- REQUIRES_NEW:创建一个新事务,如果当前存在事务,暂停当前事务。
- NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,暂停当前事务。
- NEVER:以非事务的方式执行操作,如果当前存在事务,抛出异常。
- NESTED:如果当前存在事务,则在一个嵌套的事务中执行,如果当前没有事务,则创建一个新事务。
下面分别介绍基于注解和编程式事务管理的使用方法:
使用注解的方式来指定事务的传播行为,可以在方法上加上@Transactional注解,指定propagation属性来设置传播行为。例如:
@Transactional(propagation = Propagation.REQUIRED) public void methodA(){ // 方法逻辑 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodB(){ // 方法逻辑 }使用编程式事务管理的方式来设置事务的传播行为,可以通过
TransactionTemplate类来定义事务属性。例如:@Autowired private TransactionTemplate transactionTemplate; public void methodA(){ transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { // 方法逻辑 } }); } public void methodB(){ transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { // 方法逻辑 } }); }使用上述的方法,可以根据需要来指定事务的传播行为,从而实现更灵活的事务管理。在实际应用中,需要根据具体的业务需求来选择合适的事务传播行为。
1年前