我正在尝试一种适当的方法来处理.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中使用?
发布于 2015-01-08 16:04:06
为什么不做你正在做的相反的事情,然后在最后,将它们全部交换回+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的依据。你可能需要编辑你的原始问题与澄清。
锁定的另一个选项是向表中添加一个时间戳/日期时间列,并为您正在处理的所有条目分配一个常见的"lastLocked“日期时间。然后,您可以始终清楚,如果有人没有解锁时,完成后,一个给定的时间段,如10,20分钟左右,视需要。
发布于 2015-01-08 19:49:05
您应该通过正确的错误处理来处理这个问题。通常,我只对用户启动事件添加错误处理,而不是对每个子/函数/属性添加错误处理。这样,错误将返回到用户启动的事件,并在此时停止所有代码。这是您应该维护的连接和事务的相同位置。
然后,您可以为不同的异常类型添加特定的catch块,并正确地处理它们,在这种情况下,您将得到一个SQLException,您可以检查和处理您想要的。
https://stackoverflow.com/questions/27843815
复制相似问题