处理SQL锁

时间:2015-01-08 15:35:10

标签: sql vb.net

我试图想出一种在.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有一个locktimeout属性:http://msdn.microsoft.com/en-us/library/ms182729.aspx。是否值得在.NET中使用它?

2 个答案:

答案 0 :(得分:0)

为什么不反正你正在做的事情,然后最后把它们全部换回+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的基础。您可能需要在澄清的情况下编辑原始问题。

锁定的另一个选项是向表中添加timestamp / datetime列,并为您正在处理的所有条目分配一个公共的“lastLocked”日期时间。然后,你可以随时清除是否有人在一段时间内完成后解锁,如需要10分钟,20分钟左右。

答案 1 :(得分:0)

您应该通过正确的错误处理来处理这个问题。作为一项规则,我只在用户启动事件上添加错误处理,而不是在每个子/函数/属性上添加错误处理。这样,错误将冒回用户启动的事件并在此时停止所有代码。这与您的连接和交易应保持相同。

然后,您可以为不同的异常类型添加特定的catch块并正确处理它们,在这种情况下,您将获得一个SQLException,您可以检查并处理您想要的内容。