来自控制器的Newbie Spring交易问题

时间:2011-01-31 21:51:28

标签: spring rest jpa transactions

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

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

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

控制器A:从事件队列中读取所有“待处理”事件

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

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

控制器B:从事件队列中读取所有“待处理”事件

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

控制器B不应该是控制器A已经拾取的值&处理...

所以我期待我正在寻找的是跨交易的“读锁”。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

希望有所帮助。