有没有比使用 TransactionSynchronizationManager.isActualTransactionActive() 更好的方法来检测 Spring DB 事务是否处于活动状态?

发布于 2024-11-29 18:36:29 字数 574 浏览 0 评论 0原文

我有一些遗留代码,现在正尝试在 Spring 下重用。该代码深深地嵌套在其他代码中,因此重新设计并不实际,并且在很多情况下都会被调用,只有其中一些是通过 Spring 进行的。我想做的是使用 Spring 事务(如果已经启动);否则,继续使用现有(旧版)数据库连接机制。我们的第一个想法是让我们的遗留类成为一个 bean 并使用注入的 TransactionPlatformManager ,但这似乎没有任何与我们的情况密切相关的方法。一些研究表明 Spring 有一个名为 TransactionSynchronizationManager 的类,它有一个静态方法 isActualTransactionActive()。我的测试表明此方法是检测 Spring 事务是否处于活动状态的可靠方法:

  • 当通过不带 @Transactional 注释的 Spring 服务调用时,它返回 false
  • 当通过带有 @Transactional 的 Spring 服务调用时,它返回 true
  • 在我称为现有方式的遗留方法中,它返回 false

我的问题:是否有更好的方法来检测事务是否处于活动状态?

I have some legacy code that I am now trying to re-use under Spring. This code is deeply nested in other code so it's not practical to redesign and is called in many situations, only some of which are through Spring. What I'd like to do is to use the Spring transaction if one has been started; otherwise, continue to use the existing (legacy) db connection mechanism. Our first thought was to make our legacy class a bean and use an injected TransactionPlatformManager, but that does not seem to have any methods germane to our situation. Some research showed that Spring has a class called TransactionSynchronizationManager which has a static method isActualTransactionActive(). My testing indicates this method is a reliable way of detecting if a Spring transaction is active:

  • When called via Spring service without the @Transactional annotation, it returns false
  • When called via Spring service with @Transactional, it returns true
  • In my legacy method called the existing way, it returns false

My question: Is there a better way of detecting if a transaction is active?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

森末i 2024-12-06 18:36:29

没有比 TransactionSynchronizationManager.isActualTransactionActive()。它是 spring 用来处理事务的实用方法。尽管不建议在代码中使用它,但对于某些特定情况,您应该这样做 - 这就是它是公开的。

另一种方法可能是使用实体管理器/会话/连接并检查是否存在现有事务,但我更喜欢同步管理器。

No better way than the TransactionSynchronizationManager.isActualTransactionActive(). It is the utility method used by spring to handle the transactions. Although it is not advisable to use it within your code, for some specific cases you should - that's why it's public.

Another way might be to use the entity manager / session / connection and check there if there's an existing transaction, but I'd prefer the synchronization manager.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文