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

Spring的交易暂停如何运作?

卓雅达
2023-03-14
问题内容

我的问题基本上和这里的一样,但是我对答案不满意,所以我正在写这个问题。

在SpringFramework手册中,声明对于PROPAGATION_REQUIRES_NEW,当前事务将被挂起。实际如何实施?我知道大多数数据库不支持嵌套事务,并且在一个连接中只能运行一个事务。这意味着您不能仅仅“不使用”原始事务并启动一个新事务-在启动新事务之前,您必须提交或回滚原始事务。

例:

START TRANSACTION
SELECT ...
UPDATE ...
-- Now we run method with PROPAGATION_REQUIRES_NEW
-- How do we "suspend" transaction so we can start new one?
START TRANSACTION
UPDATE ...
COMMIT
-- We returned from the method, result was commited
-- Now we'd like to "unsuspend" the original transaction so it can be commited/rollbacked, but how?

还是可以使用另一个连接(会话对象)来实现?这样我们就可以停止使用原始连接并创建一个可以开始新交易的新连接了吗?

我在这里遗漏了一些显而易见的东西,没有人愿意去解释它(至少在Spring文档,Spring in Action,Spring Persistencewith Hibernate中没有)。

非常感谢!


问题答案:

挂起事务的目的是将线程的当前事务更改为新事务。这将与嵌套事务的语义不一致,因为新事务和暂停的事务是彼此完全独立的。没有连接级别的API支持挂起事务,因此必须使用其他连接来完成。如果您将JTA与Spring结合使用,则由JTA事务管理器完成。如果使用的是DataSourceTransactionManager,则可以查看代码,看到它将把当前连接保存为“挂起的资源”,并从数据源中获取新连接以进行新事务。



 类似资料:
  • 问题内容: 每当我要保留任何实体时,都会执行以下代码。看起来一切正常,但我不明白它是如何工作的! 上面的EntityManager是整个应用程序共享的单个实例。开始交易后;我只是说em.persist(entity)..hibernate如何知道它属于哪个事务! 假设我的应用程序上有10个并发用户,并且所有10个线程都在执行上述代码。因此,正在创建和提交10个独立的事务。但是我并没有将所有10个不

  • 问题内容: 如何使用Java脚本暂停和恢复setInterval()函数? 例如,也许我有一个秒表来告诉您您浏览网页的秒数。有一个“暂停”和“恢复”按钮。 clearInterval()在此处不起作用 的原因是,如果用户在第40秒和第800毫秒单击“暂停”按钮,则当他单击“恢复”按钮时,经过的秒数必须在之后增加1 200毫秒。如果我在计时器变量上使用clearInterval()函数(单击暂停按钮

  • 问题内容: 最近,我开始将ucos-ii移植到Ubuntu PC。 众所周知,在ucos-ii中无法通过在pthread的回调函数中的“ while”循环中添加一个标记来执行暂停和恢复来模拟“进程”,以执行暂停和恢复操作(类似于下面的解决方案)。因为ucos- ii中的“进程”可以随时暂停或恢复! 我在下面的网站上找到了一种解决方案,但是由于过时而无法构建。它使用Linux中的进程来模拟ucos-

  • 暂停脚本的当前线程。 #p::Pause ; 按一次 Win+P 会暂停脚本. 再按一次则取消暂停. Pause [, On|Off|Toggle, OperateOnUnderlyingThread?] 参数 On|Off|Toggle 如果为空或省略, 则它默认为 Toggle. 否则, 请指定下列单词的其中一个: Toggle:如果在当前线程下的潜在线程处于运行状态,则暂停当前线程,否则让潜

  • 我已经实现了Kafka消费者,现在我有了一个场景。 从Kafka流2.2.5中读取数据。通过Srpingboot发布 加载数据库表1 将数据从表1复制到表2 清理桌子1 要执行上述操作,我需要使用quartz的调度作业(已编写)暂停/恢复Kafka使用者,该作业将数据从表1复制到表2。但是在这个活动中,我希望我的Kafka听众暂停,一旦复制完成,它应该继续。 我的实施:

  • 按照标题,我有一个使用spring Batch在后端运行的服务。 我的服务: 作业已停止,但控制台中仍输出文本: 我不知道如何在作业停止时停止-method。我怎么做?