【问题标题】:Newbie Spring Transaction question from controller来自控制器的新手 Spring Transaction 问题
【发布时间】:2011-06-18 21:33:38
【问题描述】:

我正在使用一个 spring REST 控制器,并且有一种情况,即两个 REST 客户端都调用控制器来获取要处理的值,但是我发现当它们都调用控制器时,它们都得到相同的值来处理同时。我正在使用 JPA 和 hibernate 作为提供程序。

我知道我需要将调用范围限定为单独的事务(我通过将 @Transactional 注释放在控制器方法上来完成)但发现它们仍然获得相同的值。

设备 1 - 时间戳 0:调用控制器

控制器 A: 从事件队列中读取所有“未决”事件

控制器 A:将“待处理”事件更新为“已处理”事件

设备 2 - 时间戳 0:调用控制器

控制器 B:从事件队列中读取所有“未决”事件

控制器 B:将“待处理”事件更新为“已处理”事件

控制器 B 不应该是控制器 A 已获取并处理的值...

所以我希望我正在寻找的是跨事务的“读锁”。

我对可扩展性很感兴趣,因此希望采用有助于可扩展性的最佳方法(即只想尽可能短地保留数据库事务)... 谢谢,

【问题讨论】:

    标签: spring rest jpa transactions


    【解决方案1】:

    控制器 B 和控制器 A“同时”启动,从队列中看到相同的事件。只有在其中一个控制器提交其事务后,才会更改队列。

    很难从如此简短的问题描述中描述“最佳方法”。有几种可能的方法可以做到这一点,例如,使用事务消息传递 (JMS) 甚至在新事务中执行“获取下一个待处理事件并将其标记为锁定”(但是如果事件处理失败)。

    【讨论】:

    • 谢谢 - 我不想走 JMS 路线,因为这将是一个完整的重新设计......
    【解决方案2】:

    我猜你将不得不使用“某种机制”来告诉你的其他控制器哪些事件已经在处理。所以这意味着有一种机制可以锁定事件,直到它们被处理。类似于之前建议的“获取下一个待处理事件并将其标记为锁定”。如果事务以适当的状态提交/回滚,则解锁它。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 2021-09-29
      • 2010-12-24
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多