Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 更新事务中的选定行_.net_Sql_Transactions_Transactionscope - Fatal编程技术网

.net 更新事务中的选定行

.net 更新事务中的选定行,.net,sql,transactions,transactionscope,.net,Sql,Transactions,Transactionscope,我有一个自动化项目,有一个远程数据库MsSql和多个windows/web客户端。客户端应用程序在表上检查并选择合适的行,并将其标记为保留用于在该行上操作 如何在另一个客户端选择同一行之前轻松获取值并更新所选行?我有什么选择? 如果我想为事务块内的不同表执行多个select update语句,是否可以为此使用TransactionScope? 编辑: 让我们想象一个电影票系统更复杂一点。用户选择一个座位并买票。我想为这个用户保留两分钟的座位,以便有足够的时间购买。两分钟后,其他人也可以使用。在更

我有一个自动化项目,有一个远程数据库MsSql和多个windows/web客户端。客户端应用程序在表上检查并选择合适的行,并将其标记为保留用于在该行上操作

如何在另一个客户端选择同一行之前轻松获取值并更新所选行?我有什么选择? 如果我想为事务块内的不同表执行多个select update语句,是否可以为此使用TransactionScope? 编辑:
让我们想象一个电影票系统更复杂一点。用户选择一个座位并买票。我想为这个用户保留两分钟的座位,以便有足够的时间购买。两分钟后,其他人也可以使用。在更新行之前,我运行select查询以查找第一个空座位。我的问题是关于同一用户的select和update语句之间的一段时间。我想阻止:User1的select语句运行,此时User2在User1保留座位之前运行相同的select。

如果您使用的是SQL Server,则可以在select中执行行锁定

从具有行锁的订单中选择*,其中状态为“待定”


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

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是否仍然为非null,并且锁定的用户是否为同一用户:

update seats
set totally_taken = 1
where
  seat_id = <remembered seat id>
  and time_locked = <remembered time_locked>
  and user_locked = <remembered user_locked>

这可能很有趣:谢谢你的回答。我认为第一种解决方案就足够了,但是如果我在TransactionScope中放置一个select和update查询,会发生什么呢?这是否足以在没有updlock、rowlock、readpast的情况下获得结果?@aliassce我根据您的编辑删除了答案中不相关的部分。查询将同时更新和选择,作为一个查询。您可以将其包装到事务中,但不必这样做,因为无论如何您都必须立即提交。我想了解的是,transactionScope在完成或回滚之前是否会阻止所有其他客户端访问相同的表?@aliassce transactionScope将生成begin tran调用,在这一点上,您拥有TransactionScope并不重要——它只关系到begin tran的发布。其他客户端是否会被阻止取决于您拥有的索引以及您选择数据的方式。使用select top 1查询,可能会阻止其他客户端;用一个选择。。。其中row\u id=@row\u id query,它们可能不会。