我在名爲「A」的表中有很多信息。名爲「B」的表是空的。SQL鎖定問題
我從表格中的500行,這是不是在表中「B」:
SELECT TOP 500 * FROM A WHERE
NOT EXISTS (
SELECT * FROM B WHERE
(
A.id1=B.id1 AND A.id2=B.id2
)
)
一切運作良好,但我在這裏有一個問題。
我有一個Web應用程序,它調用SQL查詢。想象一下,200人一起打電話給我的應用程序,名爲「B」的表中將會有重複。播種如何鎖定這些行?
這是正確的嗎?
SELECT TOP 500 * FROM A WITH (ROWLOCK) WHERE
NOT EXISTS (
SELECT * FROM B WITH (ROWLOCK) WHERE
(
A.id1=B.id1 AND A.id2=B.id2
)
)
爲了進行更明確:
想象當你打開我的Web應用程序,網頁電話(例如Servlet或者PHP)的SQL查詢。
如果有很多人一起打開我的應用程序,則存在線程問題。而打開的查詢正在將數據寫入名爲B的表中,另一個查詢並行地執行相同的操作。
線程問題:當一個線程讀取500行時,另一個線程可能會讀取相同的數據,因爲第一個線程此時仍在寫入數據,尚未完成。
線程1讀到,從表中 「A」 的數據: 1,2,3,4,5,6,7 ...... 500
線程1個wriote數據表命名爲 「B」: 1,2,3,4,5,6,7,... 495
線程1未完成,線程2從表「a」讀取數據: 496,497 .. 500,.. .. 995
螺紋2寫入 496,497 .. 500,.... 995
然後再線程1個寫數據
495 ... 500
對於爲例
不知道我明白。 select語句如何導致重複? – Andrew
我在這裏有點困惑。在頂部,你聲明表B是空的。這意味着你的NOT EXISTS子句不會實際過濾掉任何東西。永遠。 – Mathmagician
我更新狀態。我也寫在這裏:這是線程問題:當一個線程讀取500行時,另一個線程可能讀取相同的數據,因爲第一個線程此時仍在寫入數據,尚未完成。 必須鎖定讀取行,以便不公開 – grep