Trancastional

在Spring Boot中,使用@Transactional注解可以开启事务管理。默认情况下,@Transactional注解只对当前线程有效,也就是说,只有在使用@Transactional注解的方法中,才会开启事务。

如果在一个使用@Transactional注解的方法中,启动了一个新的线程,那么这个新线程并不会自动继承父线程的事务。这是因为Spring事务管理是基于线程的,每个线程都有自己的事务上下文。

如果需要在子线程中使用事务,可以使用TransactionTemplatePlatformTransactionManager来手动管理事务。

需要注意的是,在使用TransactionTemplatePlatformTransactionManager手动管理事务时,需要手动提交或回滚事务。可以使用TransactionStatus对象来管理事务状态。

Spring事务管理是基于线程的,这是因为Spring使用了线程本地变量(ThreadLocal)来存储事务上下文信息。

在Spring中,每个事务都有一个事务上下文(TransactionContext),它包含了事务的隔离级别、传播行为、超时时间等信息。当一个线程开始执行一个带有事务注解的方法时,Spring会创建一个新的事务上下文,并将其存储在线程本地变量中。在方法执行过程中,如果需要访问事务上下文,Spring会从线程本地变量中获取该上下文。当方法执行完毕后,Spring会将事务上下文从线程本地变量中移除。

使用线程本地变量可以保证每个线程都有自己的事务上下文,避免了多个线程之间的事务上下文混淆。同时,线程本地变量也提供了一种轻量级的方式来存储事务上下文信息,避免了在多个方法之间频繁传递事务上下文的开销。

需要注意的是,由于Spring事务管理是基于线程的,因此在使用异步方法或线程池时需要特别注意事务的传播行为和隔离级别,以避免出现意外的事务问题。

 

在使用@Transactional注解时,Spring Boot会自动为每个数据源创建一个PlatformTransactionManager事务管理器。这个事务管理器会根据当前的事务上下文来选择合适的数据源。

具体来说,Spring Boot会根据以下几个因素来选择数据源:

  1. 如果当前事务上下文中已经指定了数据源,则使用该数据源。

  2. 如果当前事务上下文中没有指定数据源,但是当前线程绑定了一个数据源,则使用该数据源。

  3. 如果当前事务上下文中没有指定数据源,并且当前线程也没有绑定数据源,则使用默认数据源。

posted @ 2023-11-17 18:23  爱喝茶的安迪  阅读(57)  评论(0)    收藏  举报