事务方法不回滚未经检查的异常
Transactional Method not rolling back for unchecked Exception
@Service
public class TransactionClass{
@AutoWire
TransactionClass tranClass;
@Autowire
TransactionRepository transRepo;
public void methodA(Data data){
try{
methodB(data)
}catch(Exception e){
//some logic
}
}
public void methodB(Data data){
//some logic
tranClass.methodC(data)
}
@Transactional
public void methodC(Data data){
//some logic
transRepo.save(data);
throw new RuntimeException();
}
}
问题是 methodC() 没有被回滚,即使抛出了未经检查的异常。
要检查事务如何使用日志工作,只需将其添加到 application.yaml
logging.level.org.springframework.transaction.interceptor: TRACE
logging.level.org.springframework.orm.jpa.JpaTransactionManager: DEBUG
logging.level.org.hibernate.SQL: DEBUG
spring.jpa.properties.hibernate.use_sql_comments: true
事务方法没有回滚,因为它有多个数据库连接。所以@Transactional 将回滚唯一的主要配置,我们在应用程序中也只能有一个主要配置。解决方案是使用链式事务。
参考这个link进一步了解链式交易:
https://blog.usejournal.com/springboot-jpa-rollback-transaction-with-multi-databases-53e6f2f143d6
@Service
public class TransactionClass{
@AutoWire
TransactionClass tranClass;
@Autowire
TransactionRepository transRepo;
public void methodA(Data data){
try{
methodB(data)
}catch(Exception e){
//some logic
}
}
public void methodB(Data data){
//some logic
tranClass.methodC(data)
}
@Transactional
public void methodC(Data data){
//some logic
transRepo.save(data);
throw new RuntimeException();
}
}
问题是 methodC() 没有被回滚,即使抛出了未经检查的异常。
要检查事务如何使用日志工作,只需将其添加到 application.yaml
logging.level.org.springframework.transaction.interceptor: TRACE
logging.level.org.springframework.orm.jpa.JpaTransactionManager: DEBUG
logging.level.org.hibernate.SQL: DEBUG
spring.jpa.properties.hibernate.use_sql_comments: true
事务方法没有回滚,因为它有多个数据库连接。所以@Transactional 将回滚唯一的主要配置,我们在应用程序中也只能有一个主要配置。解决方案是使用链式事务。
参考这个link进一步了解链式交易: https://blog.usejournal.com/springboot-jpa-rollback-transaction-with-multi-databases-53e6f2f143d6