与SQL事务和ROWLOCKS的混淆

本文关键字:ROWLOCKS SQL 事务 | 更新日期: 2023-09-27 17:53:00

我已经面对这个问题很久了。

我的窗体上有两个按钮。btnNEXT, btnSUBMIT . .

当用户单击btnNEXT时,将显示下一条记录的详细信息。然后用户输入一些数据并单击btnSUBMIT。此操作将更新该特定记录的详细信息。

现在,我有大约10个用户在使用它。当user1单击btnNEXT时,他将获得一条要修改的记录。现在我想要这个记录被锁定,没有其他用户可以看到这个记录。当User1输入详细信息并单击btnSUMBIT时,记录将被更新,锁将被释放。

另一个场景:User1单击btnNEXT。然后记录将被锁定。如果用户在没有更新任何数据的情况下关闭了应用程序,则该记录应被解锁。

我所做的:Select table with (updlock,readpast) where condition

Update table set a=1,b=2 where id=123上面的

查询满足我对行锁定和解锁的条件。但是我想在btnNEXT_Click事件中开始事务,并在btnSUMBIT_Click事件中提交事务

我怎样才能做到这一点?我想不出别的了。如果你有什么替代方案可以满足我的整个方案,请告诉我

Thanks to lot

与SQL事务和ROWLOCKS的混淆

这是无状态应用程序固有的问题。如果用户通过离开或关闭浏览器而放弃了会话,那么您就无法确定是否应该关闭会话。我想到的最佳解决方案是使用时间戳作为锁定字段,然后定期轮询锁定"太长"的记录。这不是一个完美的解决方案,但它应该能解决你90%以上的问题。

编辑OP:

@ARB,事务用于执行可能需要回滚的SQL语句序列。它通常用于保存操作(插入,更新&;删除)。你不能"回滚"一个选择语句(没有什么可以"撤销")。因此,不需要在事务中包装btnNext操作(选择)和btnSubmit操作。此外,当我使用事务时,它是以单一命令序列的形式出现的。我不能说我知道你不能在中间加入交易,但我从来没有见过这样做。根据保存函数的复杂性,btnSubmit可能是使用事务的好地方,但只有当您保存到多个表时。

总结:

由于web应用程序的无状态特性,以及无法"强制"用户"优雅"地关闭会话,您需要一种机制来"解锁"被锁定"太长"的记录。

因为在你的btnNext操作(一个选择命令)中没有什么要"回滚"的,所以没有理由在事务中包含它。如果您希望隔离btnSubmit(保存操作),那么这可能很有用。