【发布时间】:2019-11-25 12:57:35
【问题描述】:
我们有一些遗留的旧事务表,其中包含 Locked 和 LockDate 列。一次只有一个用户可以选择一个事务(行)。每当用户选择特定事务时,我们都会标记行Locked=1,因此其他用户不能选择相同的事务(直到用户保存事务或我们在一段时间后清除锁定)。问题是在系统负载下,多个用户可以在并发下选择同一个事务。我们正在做,
SELECT TOP 1 * FROM TABLE WHERE Locked=0 AND OurConditions
UPDATE TABLE SET Locked=1 WHERE ID=....
如何在对系统性能影响最小的情况下解决此问题。
【问题讨论】:
-
您不会通过持有锁来实现签入/签出功能。这将在不解决并发问题的情况下降低可伸缩性。事务和锁是短暂的。
-
您可以使用
UPDATE WHERE,以确保一次只有一个连接可以结帐/锁定。为什么使用TOP 1?你想实现一个队列吗?这是一个非常不同的和非常困难的问题 -
@PanagiotisKanavos 我想要一个简单的用户一次获得一笔交易用于处理目的。
标签: sql sql-server sql-server-2014