春天在什么对RDBMS事务管理工作也春季WebFlux支持?
例如,假设正确配置,将一个方法注释与@Transactional
标注使用Spring的事务管理器,如果发生错误回滚事务?
如果交易管理不工作,必须在@Transactional
实际的方法throw
和异常,或者必须Mono
或Flux
返回类型发出错误信号?
我知道JDBC固有阻断,并且因此任何JDBC操作必须从阻塞到反应性的,或反之亦然来桥接。
Spring的事务管理器的工作原理是使用ThreadLocal
它我假设不会在反应器环境的工作,因为反应堆是节俭线程和单线程可以换出一个工作单元另一个,而首先是等待(右?)在I / O。我知道反应器将Context
其在概念上类似于对象ThreadLocal
(是吗?),但我还没有看到提到交易利用了它的任何文件。此外,在一个事务中发生的所有JDBC操作必须使用相同的Connection
,这可能是艰难的反应方面的事情。
我的组织有WebFlux和卡桑德拉经验,但卡桑德拉有本地司机反应。
谢谢!
AFAIK春天标准事务管理不WebFlux工作。
使用@Transactional
不会工作,因为当一个注解的方法被调用时,交易机制将节省内部事务的状态ThreadLocal
调用线程的。正如你自己已经说了,这是行不通的。它块和它共享状态。
但是,您可以使用.runOn(Schedulers.parallel())
,以阻断代码发送到另一个线程。这样你就可以有可阻塞线程,您可以配置为具有相同的大小,你的数据库连接池线程池。
但即便如此仍不能依靠@Transactional
,因为方式的胎面池中重用线程。在一个标准的Servlet架构你必须每个HTTP请求一个线程。当发回响应,线程停止,它关闭了交易。在这种情况下,虽然,反应堆调度不关闭线程和重用他们的其他活动。所以,即使你可以阻止你仍然有同样的问题之前。
你有Context
你所提到的选项,我认为这将为其工作Mono
。我不知道这是否会为一个工作Flux
(我在想,在流量份额所有事件同样的背景下,这是你不想要的东西)。
另一种选择是使用Touple2与T1
作为业务对象和T2
事务上下文。因为你有技术性的东西混合业务逻辑和它overcomplicates东西我不建议这虽然。
我最好的选择将是你自己做交易/连接管理:
所有在上的阻塞线程一个码块。
这将是更安全(无泄漏),更容易理解。也正因为你基本上做自己的一切,你可以选择什么样的错误处理方式最适合您的方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句