我有N个进程每隔t分钟(N> t)向数据库中的表A插入和更新行(多行),例如从凌晨12:00(所有N个进程)开始。我将最后一次更新时间戳保存在单独的表B中,以检查数据上次更新的时间。锁定数据库
我想读取锁定来检查时间戳,看看数据是否是最新的,如果不尝试获取表上的锁,更新数据库和释放锁。
这可以使用linq-to-sql来完成吗?是否有进程获取锁的可能性,并且由于某种原因不会释放锁?在那种情况下,是否有一个超时值,锁定会自动释放?
任何指针都会有帮助。谢谢!
我有N个进程每隔t分钟(N> t)向数据库中的表A插入和更新行(多行),例如从凌晨12:00(所有N个进程)开始。我将最后一次更新时间戳保存在单独的表B中,以检查数据上次更新的时间。锁定数据库
我想读取锁定来检查时间戳,看看数据是否是最新的,如果不尝试获取表上的锁,更新数据库和释放锁。
这可以使用linq-to-sql来完成吗?是否有进程获取锁的可能性,并且由于某种原因不会释放锁?在那种情况下,是否有一个超时值,锁定会自动释放?
任何指针都会有帮助。谢谢!
得到一个读锁,检查时间戳,看看数据是最新的, 如果不尝试,并在表上得到锁,更新数据库,并释放 锁。
- 一个上的时间戳获得S锁
- B获得的时间戳
- A S锁获得X锁:
这两个进程试图同时做保证僵局关于数据
A被B阻塞,B被阻塞A =>死锁。
有发布
这样的行为将是一个完整的灾难,使编程交易不可能超时值之后,自动上锁 是。你可以要求和存在的是要求锁定放弃,如果它不能在超时获得:SET LOCK_TIMEOUT
。
难以回答您的根本问题,因为您提出了您的解决方案,但不是您试图解决的实际问题。作为数据库中的一般评论,条件更新是以面向集合的方式通过添加适当的谓词来完成的,例如。 UPDATE ... WHERE timestamp < @last_timestamp
并让引擎找出如何正确实施。