我有一個主鍵簡單的表。大部分讀取操作都是通過密鑰的確切值獲取一行。如何鎖定數據庫表或一系列行來寫入?
每行中的數據與鍵之前和之後的行保持一些關係。所以當我插入一個新行時,我需要讀取它要輸入的兩行,進行一些計算然後插入。
顯而易見的問題是,同時另一個連接可能會在相同的時間間隔內添加一個帶有鍵值的行。如果它與第二次插入失敗的密鑰值完全相同,我將予以報道,但如果密鑰值不同,但在相同的時間間隔內可能會破壞關係。
解決方案似乎是在我決定添加新行或(如果可能的話,我懷疑)鎖定鍵值的間隔時鎖定整個表格進行寫入。但我更喜歡那個時候只讀事務不會被阻塞。
我在客戶端程序和IBM DB2免費版中使用的ODBC與libodbc++ wrapper for C++(儘管數據庫選擇可能仍會更改)。這就是我想這樣做的:
- 開始在連接自動提交和默認隔離模式
- 當需要添加一個新行,設置自動提交虛假和隔離模式連載
- 之前和新的鍵值後
- 計算讀取行和插入新行
- 提交
- 返回到自動提交和默認隔離模式
這會做這份工作嗎?是否允許其他交易同時閱讀?還有其他更好的方法嗎?
順便說一句,我沒有在libodbC++ i/f中看到一種指定只讀事務的方式。在odbc中可能嗎?
編輯:感謝非常有用的答案,我有麻煩選擇一個。
什麼是「真正的可串行性」? – Quassnoi 2010-11-11 22:30:54
謝謝。不幸的是,DB2不支持「LIMIT 1」。我使用'ORDER BY'並取第一行。它會鎖定整個桌子嗎?我想把它改成'SELECT * from mytable WHERE key =(SELECT max(key)FROM mytable where key
davka
2010-11-14 10:44:29
只修復了我的查詢;忘記了ORDER BY子句。 '''SELECT max(key)FROM mytable其中鍵
2010-11-15 01:59:28