繁体   English   中英

锁定数据库

[英]locking database

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

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

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

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

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

当两个进程尝试同时执行死锁时,可以保证死锁:

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

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

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

这样的行为将是一场彻底的灾难,并使编程交易变得不可能 您可以要求并存在的是,如果无法在超时时间内获得锁,则请求放弃该锁: SET LOCK_TIMEOUT

很难回答您的基本问题,因为您提出了解决方案,但没有提出要解决的实际问题。 作为数据库中的一般注释,条件更新通过添加适当的谓词(例如)以面向集合的方式完成。 UPDATE ... WHERE timestamp < @last_timestamp ,让引擎找出如何正确实现它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM