首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理SQL锁

处理SQL锁
EN

Stack Overflow用户
提问于 2015-01-08 15:35:10
回答 2查看 62关注 0票数 0

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

代码语言:javascript
复制
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中使用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 16:04:06

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

代码语言:javascript
复制
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分钟左右,视需要。

票数 0
EN

Stack Overflow用户

发布于 2015-01-08 19:49:05

您应该通过正确的错误处理来处理这个问题。通常,我只对用户启动事件添加错误处理,而不是对每个子/函数/属性添加错误处理。这样,错误将返回到用户启动的事件,并在此时停止所有代码。这是您应该维护的连接和事务的相同位置。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27843815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档