处理 SQL 锁

Handling SQL Locks

我正在尝试想出一种适当的方法来处理 .NET 中的 SQL 记录锁。请看下面的伪代码:

Create Serialized Transaction
UPDATE dbusns SET USN=-100 WHERE USN=100
UPDATE dbusns SET USN=100 WHERE URN=1 and dataset='Dataset1' 
UPDATE dbusns SET USN=100 WHERE URN=12 and dataset='Dataset2' 
UPDATE dbusns SET USN=100 WHERE URN=9 and dataset='Dataset1' 
UPDATE dbusns SET USN=100 WHERE URN=7 and dataset='Dataset1' 
commit

通常最多有 100 条记录要更新。如果用户在创建序列化事务之后和提交之前搜索 USN 100,那么它将挂起。

处理这种挂起的最佳方法是什么?您是让 SQLConnection/SQLCommand 超时还是以某种方式设置锁定超时然后显示有用的错误消息。

我注意到 SQL 有一个锁定超时属性:http://msdn.microsoft.com/en-us/library/ms182729.aspx。是否值得在 .NET 中使用它?

为什么不做你正在做的相反的事情,然后在最后,将它们全部换回 +100

Create Serialized Transaction
UPDATE dbusns SET USN = -100 WHERE USN=100
UPDATE dbusns SET USN = -100 WHERE URN=1 and dataset='Dataset1' 
UPDATE dbusns SET USN = -100 WHERE URN=12 and dataset='Dataset2' 
UPDATE dbusns SET USN = -100 WHERE URN=9 and dataset='Dataset1' 
UPDATE dbusns SET USN = -100 WHERE URN=7 and dataset='Dataset1' 

UPDATE dbusns SET USN=100 WHERE URN=100

commit

但是我不知道你原来把100改成-100的依据是什么。您可能需要编辑您的原始问题并加以说明。

锁定的另一个选项是向 table 添加一个 timestamp/datetime 列,并为您正在处理的所有条目分配一个通用的 "lastLocked" 日期时间。然后,您可以根据需要随时清除是否有人在给定时间段(如 10、20 分钟左右)后完成后未解锁。

您应该通过适当的错误处理来处理这个问题。通常,我只在用户启动事件上添加错误处理,而不是在每个 sub/function/property 上。这样,错误将冒泡回到用户发起的事件并在该点停止所有代码。这也是您的连接和交易应该保持的地方。

然后,您可以为不同的异常类型添加特定的 catch 块并正确处理它们,在这种情况下,您将得到一个 SQLException,您可以根据需要进行检查和处理。