0

我有 N 个进程每 t 分钟(N > t)向数据库中的表 A 插入和更新行(多行),比如说从上午 12:00 开始(所有 N 个进程)。我将上次更新时间戳保存在单独的表 B 中,以检查数据上次更新的时间。

我正在考虑获得一个读锁来检查时间戳并查看数据是否是最新的,如果不是,请尝试在表上获得锁,更新数据库并释放锁。

这可以使用 linq-to-sql 完成吗?进程是否有可能获得锁并且由于某种原因不会释放锁?在那种情况下,是否有超时值,之后锁会自动释放?

任何指针都会有所帮助。谢谢!

4

1 回答 1

1

获取读锁以检查时间戳并查看数据是否是最新的,如果不是,请尝试获取表上的锁,更新数据库并释放锁。

当两个进程尝试同时执行此操作时,这是保证死锁:

  • A 在时间戳上获得 S 锁
  • B 在时间戳上获得 S 锁
  • A 获取数据的 X 锁
  • B 尝试获取 X 数据锁定,被 A 阻止
  • A 更新数据
  • A 尝试更新时间戳,它需要 X 锁定它。被B的S锁挡住了

A被B阻塞,B被A阻塞=>死锁。

是否有超时值,之后锁会自动释放

这种行为将是一场彻头彻尾的灾难,并使编程事务变得不可能。您可以要求并且存在的是,如果无法在超时时间内获得锁,则放弃该锁的请求SET LOCK_TIMEOUT: .

很难回答您的潜在问题,因为您提出了解决方案,而不是您试图解决的实际问题。作为数据库中的一般评论,条件更新是通过添加适当的谓词以面向集合的方式完成的,例如。UPDATE ... WHERE timestamp < @last_timestamp并让引擎弄清楚如何正确实现它。

于 2012-08-09T11:51:45.560 回答