当前位置: 首页 > 面试题库 >

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

麻华辉
2023-03-14
问题内容

Spring对RDBMS事务管理的支持在Spring WebFlux中是否也起作用?

例如,假设配置正确,带有@Transactional注释的方法是否会使用Spring事务管理器并在发生错误时回滚事务?

如果事务管理确实起作用,那么@Transactional方法是否必须实际throw和异常,或者必须是MonoFlux返回类型发出错误信号?

我知道JDBC本质上是阻塞的,因此任何JDBC操作都必须从阻塞过渡到反应性,反之亦然。

Spring事务管理器通过使用ThreadLocal(对吗?)工作,我假设它在Reactor环境中不起作用,因为Reactor在线程方面很节俭,并且在第一个线程正在等待时,一个线程可以将一个工作单元换成另一个工作单元在I
/
O上。我知道Reactor的Context对象在概念上类似于ThreadLocal(对吗?),但是我还没有看到任何文档提到该事务使用了它。另外,事务中发生的所有JDBC操作都必须使用相同的操作,Connection这在响应式上下文中可能很难做到。

我的组织具有WebFlux和Cassandra的经验,但是Cassandra具有本机响应式驱动程序。

谢谢!


问题答案:

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. 关闭/释放数据库连接

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

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



 类似资料:
  • Spring对RDBMS事务管理的支持在Spring WebFlux中也起作用吗? 例如,假设配置正确,用注释注释的方法是否会使用Spring事务管理器并在发生错误时回滚事务? 如果事务管理确实起作用,那么方法是否确实和异常,或者或返回类型是否发出错误信号? 我知道JDBC本质上是阻塞的,因此任何JDBC操作都必须从阻塞桥接到反应桥接,反之亦然。 我的组织有WebFlux和Cassandra的经验

  • 我有两个实体,即公司和用户。一个公司可以有很多用户。因此,当我保存一个公司时,它也会在一个事务中创建一个用户。如果用户的插入由于某种原因失败了,我想公司的插入应该回滚,这是目前不发生的。 因此,如果不知何故,在请求中传递的电子邮件已经存在,那么用户实体将不会被保存,所以在这种情况下,我需要公司应该回滚。你知道我怎么才能做到这一点吗?

  • 假设没有访问MongoDB服务器,使用Meteor开发没有多大意义,我是否正确? Meteor是一个构建、打包和部署应用程序和网站的优秀框架。从开发角度来看,模板和响应性数据库工作使原型制作比大多数MVC容易得多。 我知道在幕后,WebSocket和DDP提供了实时同步的魔力,这意味着你需要访问MongoDB服务器,这是你在GoogleAppEngine、Parse或Kinvey等PaaS解决方案

  • 问题内容: 我在尝试将Hibernate事务中所做的更改推送到数据库以使DbUnit在我的测试用例中正常工作时遇到问题。似乎DbUnit没有看到Hibernate所做的更改,因为它们尚未在事务结束时提交。 这是我过度简化的测试用例,用于演示我的问题:- 我使用DbUnit的整个想法是: 将数据保存到多个表的调用。 使用DbUnit从XML获取期望的表。 使用DbUnit从数据库获取实际表。 做。

  • 就像在主题中一样,我可以使用Thymeleaf布局方言和spring吗?我必须使用Spring标准方言吗? 网上有这么多的资料,这让我很困惑。 我已经开始使用布局方言,但我无法使用整个应用程序。 这是我的模板主文件: 以及控制器返回的我的示例主体文件: 但不幸的是,这段代码只适用于布局方言。 有人能帮我把代码转换成spring标准方言吗? 我的手机配置:

  • 这是请求 我试图在我的应用程序中使用上面的ejb 1) 包含JDBC语句2018-03-27 16:28:17,683:错误:http-nio-6180-exec-1:BatchingBatch.PerformExecution:HHH000315:Exception执行批处理[java.sql.BatchUpdateException:batch entry 0 insert into TEAM