我试图想出一种在.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中使用它?
答案 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,您可以检查并处理您想要的内容。