0

我有一个具有远程数据库(MsSql)和多个 Windows/Web 客户端的自动化项目。客户端应用程序检查并选择表上的合适行并将其标记为保留以对该行进行操作。

  1. 如何在另一个客户选择同一行之前轻松获取价值并更新选定的行?我有什么选择?
  2. TransactionScope如果我想在事务块内执行多​​个 select-update 语句(针对不同的表),我可以用于此目的吗?

编辑:让我们想象一个电影票系统(我的有点复杂)。用户选择座位并购买车票。我想为这个用户预留两分钟的座位,以便有足够的时间购买。两分钟后,其他人也可以使用它。在更新行之前,我运行一个选择查询来找到第一个空座位。我的问题是关于同一用户的选择和更新语句之间的一点时间。我想阻止:User1 的 select 语句运行,当时 User2 在 User1 保留席位之前运行相同的选择。

4

2 回答 2

2

由于您希望在锁定和执行实际操作之间进行用户输入,那么

update top (1) seats
set time_locked = getdate(), user_locked = <the site user>
output inserted.seat_id, inserted.time_locked, inserted.user_locked
where <your conditions> and time_locked is null

在这种情况下,您不会在执行此操作之前启动事务,因为您想立即提交更改。您可以稍后打开交易,只要您锁定一行,甚至更晚。

如果您从事务中执行此操作,那么其他进程将等到您提交该事务,因此您将不会获得任何并发性。然后您将看到,一个进程正在运行,所有其他进程都在等待。

当您稍后回到锁定的行时,您验证 time_locked 仍然是非空的,并且锁定的用户是同一个用户:

update seats
set totally_taken = 1
where
  seat_id = <remembered seat id>
  and time_locked = <remembered time_locked>
  and user_locked = <remembered user_locked>
于 2012-10-20T23:22:52.233 回答
0

如果您使用的是 SQL Server,您可以在您的选择中执行 ROWLOCK。

SELECT * FROM Orders WITH ROWLOCK WHERE Status='Pending'

于 2012-10-20T23:10:55.700 回答