2012-08-09 180 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並讓引擎找出如何正確實施。