在Spring Boot中,使用@Transactional
注解可以开启事务管理。默认情况下,@Transactional
注解只对当前线程有效,也就是说,只有在使用@Transactional
注解的方法中,才会开启事务。
如果在一个使用@Transactional
注解的方法中,启动了一个新的线程,那么这个新线程并不会自动继承父线程的事务。这是因为Spring事务管理是基于线程的,每个线程都有自己的事务上下文。
如果需要在子线程中使用事务,可以使用TransactionTemplate
或PlatformTransactionManager
来手动管理事务。
需要注意的是,在使用TransactionTemplate
或PlatformTransactionManager
手动管理事务时,需要手动提交或回滚事务。可以使用TransactionStatus
对象来管理事务状态。
Spring事务管理是基于线程的,这是因为Spring使用了线程本地变量(ThreadLocal)来存储事务上下文信息。
在Spring中,每个事务都有一个事务上下文(TransactionContext),它包含了事务的隔离级别、传播行为、超时时间等信息。当一个线程开始执行一个带有事务注解的方法时,Spring会创建一个新的事务上下文,并将其存储在线程本地变量中。在方法执行过程中,如果需要访问事务上下文,Spring会从线程本地变量中获取该上下文。当方法执行完毕后,Spring会将事务上下文从线程本地变量中移除。
使用线程本地变量可以保证每个线程都有自己的事务上下文,避免了多个线程之间的事务上下文混淆。同时,线程本地变量也提供了一种轻量级的方式来存储事务上下文信息,避免了在多个方法之间频繁传递事务上下文的开销。
需要注意的是,由于Spring事务管理是基于线程的,因此在使用异步方法或线程池时需要特别注意事务的传播行为和隔离级别,以避免出现意外的事务问题。
标签:事务管理,事务,Spring,Trancastional,线程,注解,上下文 From: https://www.cnblogs.com/andy1234/p/17839457.html