【发布时间】:2011-04-20 22:34:48
【问题描述】:
我陷入了锁定决定,我认为可以利用您的专业知识。
我想向表中添加一个新行,并且多个线程正在尝试将该新行插入到表中。我只希望其中一个成功。在插入过程中,可能有来自其他线程的请求从表中读取一些数据,它们应该会成功。
对于这种情况,最好的锁定方法是什么?排他表锁不起作用,因为我希望读取查询成功。
谢谢 xoxo
【问题讨论】:
标签: linq-to-sql locking
我陷入了锁定决定,我认为可以利用您的专业知识。
我想向表中添加一个新行,并且多个线程正在尝试将该新行插入到表中。我只希望其中一个成功。在插入过程中,可能有来自其他线程的请求从表中读取一些数据,它们应该会成功。
对于这种情况,最好的锁定方法是什么?排他表锁不起作用,因为我希望读取查询成功。
谢谢 xoxo
【问题讨论】:
标签: linq-to-sql locking
让数据库完成工作-唯一索引键,以便第一个插入者获胜。没有万无一失的方法可以在 SubmitChanges 之前检测到它,不会给您带来比开始时更多的麻烦。
【讨论】:
如果您想在不干扰读取的情况下序列化特定键上的插入,并且您控制所有将执行此操作的代码,请查看 sp_getapplock。使 applock 的名称与您尝试阻止插入的键相对应,然后让并发插入代码对 sp_getapplock 执行 0 超时调用。成功的应该再次检查以确保记录不存在同时持有锁,执行插入,然后释放锁。它不漂亮,也不快,但它可以满足您的需求。您还可以在 DataContext 上连接 sp_getapplock 和相关的 SP,这样您仍然可以通过 L2S 调用它们,而不是发送命令。
【讨论】: