栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring事务管理可以与Spring WebFlux一起使用吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring事务管理可以与Spring WebFlux一起使用吗?

AFAIK Spring标准事务管理不适用于WebFlux。

使用

@Transactional
不会起作用,因为在调用带注释的方法时,事务机制会将事务状态保存
ThreadLocal
在调用线程的内部。如您自己所说,这是行不通的。它阻止并共享状态。

但是,您可以使用a

.runOn(Schedulers.parallel())
命令将阻止代码发送到另一个线程。这样,您可以拥有一个带有可阻塞线程的线程池,您可以将其配置为与数据库连接池相同的大小。

但是即使如此,您还是不能依靠它,

@Transactional
因为胎面池重用了线程。在标准Servlet体系结构中,每个HTTP请求只有一个线程。返回响应后,线程将停止,这将关闭事务。但是在这种情况下,Reactor调度程序不会关闭线程,而是将其重用于其他事件。因此,即使您可以阻止,您仍然会遇到与以前相同的问题。

您确实有

Context
提到的选项,我认为这对您有用
Mono
。我不确定它是否适用
Flux
(我认为Flux中的所有事件都共享相同的上下文,这是您不想要的)。

另一个选择是使用Touple2

T1
作为业务对象和
T2
事务上下文。我不建议这样做,因为您将业务逻辑与技术内容混合在一起,并且使事情变得过于复杂。

我最好的选择是亲自进行事务/连接管理:

  1. 获取数据库连接
  2. 开启TX
  3. 做阻塞IO的东西
  4. 关闭TX
  5. 关闭/释放数据库连接

都在阻塞线程上的一个代码块中。

这样会更安全(无泄漏)并且更易于理解。另外,由于您基本上可以自己做所有事情,因此您可以选择最适合您的情况的错误处理方式。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/570490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号