Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在协同程序中处理Spring事务?_Spring_Kotlin_Transactions_Kotlinx.coroutines - Fatal编程技术网

如何在协同程序中处理Spring事务?

如何在协同程序中处理Spring事务?,spring,kotlin,transactions,kotlinx.coroutines,Spring,Kotlin,Transactions,Kotlinx.coroutines,众所周知,Spring事务绑定到线程:对于正在进行的事务,存在特定于线程的局部变量。事务对协同路由上下文一无所知。那么,如果我想从协同程序内部调用@Transactional方法,该怎么办:它安全吗 假设我们在JobProcessor bean中有一个处理作业列表的方法。每个作业都在异步{}中处理。我想在每次处理成功或失败后,使用bean JobService的@Transactional方法更新数据库 class JobProcessor { fun process(jobs: Lis

众所周知,Spring事务绑定到线程:对于正在进行的事务,存在特定于线程的局部变量。事务对协同路由上下文一无所知。那么,如果我想从协同程序内部调用@Transactional方法,该怎么办:它安全吗

假设我们在JobProcessor bean中有一个处理作业列表的方法。每个作业都在异步{}中处理。我想在每次处理成功或失败后,使用bean JobService的@Transactional方法更新数据库

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已存在因此,最初的问题仍然存在。