我有 N 个进程每 t 分钟(N > t)向数据库中的表 A 插入和更新行(多行),比如说从上午 12:00 开始(所有 N 个进程)。我将上次更新时间戳保存在单独的表 B 中,以检查数据上次更新的时间。
我正在考虑获得一个读锁来检查时间戳并查看数据是否是最新的,如果不是,请尝试在表上获得锁,更新数据库并释放锁。
这可以使用 linq-to-sql 完成吗?进程是否有可能获得锁并且由于某种原因不会释放锁?在那种情况下,是否有超时值,之后锁会自动释放?
任何指针都会有所帮助。谢谢!
我有 N 个进程每 t 分钟(N > t)向数据库中的表 A 插入和更新行(多行),比如说从上午 12:00 开始(所有 N 个进程)。我将上次更新时间戳保存在单独的表 B 中,以检查数据上次更新的时间。
我正在考虑获得一个读锁来检查时间戳并查看数据是否是最新的,如果不是,请尝试在表上获得锁,更新数据库并释放锁。
这可以使用 linq-to-sql 完成吗?进程是否有可能获得锁并且由于某种原因不会释放锁?在那种情况下,是否有超时值,之后锁会自动释放?
任何指针都会有所帮助。谢谢!
获取读锁以检查时间戳并查看数据是否是最新的,如果不是,请尝试获取表上的锁,更新数据库并释放锁。
当两个进程尝试同时执行此操作时,这是保证死锁:
A被B阻塞,B被A阻塞=>死锁。
是否有超时值,之后锁会自动释放
这种行为将是一场彻头彻尾的灾难,并使编程事务变得不可能。您可以要求并且存在的是,如果无法在超时时间内获得锁,则放弃该锁的请求SET LOCK_TIMEOUT
: .
很难回答您的潜在问题,因为您提出了解决方案,而不是您试图解决的实际问题。作为数据库中的一般评论,条件更新是通过添加适当的谓词以面向集合的方式完成的,例如。UPDATE ... WHERE timestamp < @last_timestamp
并让引擎弄清楚如何正确实现它。