Java在新线程里Transactional事务不起作用
在Java中,事务是通过@Transactional注解来实现的。如果在新线程中使用@Transactional注解,事务可能不会起作用,这是因为事务管理器在Spring中是与线程绑定的。在新线程中,事务管理器无法识别当前线程,因此无法管理该线程的事务。
要在新线程中使用事务,可以使用Spring的异步执行框架。Spring的异步执行框架允许您在新线程中执行代码,并且可以确保事务在新线程中起作用。
以下是使用Spring异步执行框架在新线程中执行事务的示例代码:
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
@Transactional
public void myMethod() {
//执行一些数据库操作
myRepository.save(someObject);
//在新线程中执行一些操作
CompletableFuture.runAsync(() -> {
//在新线程中执行一些数据库操作
myRepository.save(anotherObject);
}).join();
}
}
在上面的示例代码中,我们在新线程中使用了CompletableFuture.runAsync()方法来执行一些数据库操作。在该方法中,我们传递了一个Lambda表达式,该表达式执行一些数据库操作。我们使用.join()方法来等待新线程中的操作完成。
通过使用Spring异步执行框架,我们可以确保事务在新线程中起作用。但是,请注意,如果在新线程中发生异常,事务将被回滚。因此,在新线程中执行的操作必须是安全的,以避免不必要的回滚
原文地址: https://www.cveoy.top/t/topic/eF0G 著作权归作者所有。请勿转载和采集!