2012-08-09 136 views
0

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

我想读取锁定来检查时间戳,看看数据是否是最新的,如果不尝试获取表上的锁,更新数据库和释放锁。

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

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

回答

1

得到一个读锁,检查时间戳,看看数据是最新的, 如果不尝试,并在表上得到锁,更新数据库,并释放 锁。

  • 一个上的时间戳获得S锁
  • B获得的时间戳
  • A S锁获得X锁:

这两个进程试图同时做保证僵局关于数据

  • B尝试获取X锁定数据,被阻止A
  • A更新数据
  • A尝试更新时间戳,它需要X锁。被B的S锁锁定
  • A被B阻塞,B被阻塞A =>死锁。

    有发布

    这样的行为将是一个完整的灾难,使编程交易不可能超时值之后,自动上锁 是。你可以要求和存在的是要求锁定放弃,如果它不能在超时获得:SET LOCK_TIMEOUT

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