如何在协同程序中处理Spring事务?
众所周知,Spring事务绑定到线程:对于正在进行的事务,存在特定于线程的局部变量。事务对协同路由上下文一无所知。那么,如果我想从协同程序内部调用@Transactional方法,该怎么办:它安全吗 假设我们在JobProcessor bean中有一个处理作业列表的方法。每个作业都在异步{}中处理。我想在每次处理成功或失败后,使用bean JobService的@Transactional方法更新数据库如何在协同程序中处理Spring事务?,spring,kotlin,transactions,kotlinx.coroutines,Spring,Kotlin,Transactions,Kotlinx.coroutines,众所周知,Spring事务绑定到线程:对于正在进行的事务,存在特定于线程的局部变量。事务对协同路由上下文一无所知。那么,如果我想从协同程序内部调用@Transactional方法,该怎么办:它安全吗 假设我们在JobProcessor bean中有一个处理作业列表的方法。每个作业都在异步{}中处理。我想在每次处理成功或失败后,使用bean JobService的@Transactional方法更新数据库 class JobProcessor { fun process(jobs: Lis
class JobProcessor {
fun process(jobs: List<MyJob>) =
jobs.map { job ->
async {
try {
....//processing
jobService.success(job)
} catch (t: Throwable) {
jobService.failure(job)
}
}
}
class JobService {
@Transactional
fun success(job: MyJob) {...}
@Transactional
fun failure(job: MyJob) {...}
}
类作业处理器{
乐趣流程(作业:列表)=
jobs.map{job->
异步的{
试一试{
..//处理
jobService.success(作业)
}捕获(t:可丢弃){
jobService.failure(作业)
}
}
}
职业分类服务{
@交易的
有趣的成功(job:MyJob){…}
@交易的
有趣的失败(作业:MyJob){…}
}
首先,请记住,用@Transactional
注释bean方法是不够的-确保启用了声明性事务处理,例如,通过向@Configuration
类添加@EnableTransactionManagement
或在XML配置中使用
关于您的问题:当从其包含类之外的SpringBean调用SpringBean方法时,执行带有@transactional
注释的SpringBean方法时,只有事务上下文!Spring中的声明性事务依赖于为@transactional
annota创建的AOP代理类ted类。在运行时,如果Spring bean a调用Spring bean B上的@Transactional
方法,调用将被AOP代理截获,AOP代理透明地生成事务,调用Spring bean B的原始方法,然后提交或回滚此事务
请记住:只有通过代理传入的外部方法调用才会被拦截–任何自调用调用,如您的示例中的this.process()调用
@Transactional
方法this.success()
或this.failure())
将不会启动任何事务–即使该方法被注释为@Transactional
是否流程
已具有事务上下文?否,流程没有事务上下文谢谢您指出。我已相应地更新了代码段。并且@EnableTransactionManagement已存在因此,最初的问题仍然存在。