--查詢中a使用 for update 當其他使用者查詢被鎖的記錄的時候,會跳過這條記錄。如:
--a:
select * from test_zhi where khh = '001676786773' for update; --預設行級鎖
--b:
select * from test_zhi for update skip locked; --執行後就不會展示上個sql鎖住的資料
--for update nowait 如果a先查詢資料時加了 for udpate wait, 當b查詢時也加 for update wait, b就會報錯,提示資料被鎖
--如果b不加, b就會一直等待,直到a提交後,b才繼續執行
--a:
select test_zhi_name, test_zhi_address from test_zhi where test_zhi_address = '01' for update nowait;
--b:
select test_zhi_name, test_zhi_address from test_zhi where test_zhi_address = '02' for update nowait;
--如果a使用for update nowait,b使用for update wait 3,表示3秒後提示『資源正忙。。』
--a:
select * from test_zhi where khh = '001676786773' for update nowait;
--b:
select * from test_zhi where khh = '001676786773' for update wait 3; --3s後提示資源正忙
--如果多表連線查詢,使用for update, 會把所有的表都給鎖住,如果使用for update of 表名.欄位名,就只會鎖住指定表名
--a:會鎖住a、b兩表張
select * from test_zhi1 a, test_zhi2 b where a.col5 = b.col5 for update;
--b:只會鎖住a表
select * from test_zhi1 a, test_zhi2 b where a.col5 = b.col5 for update of a.col3;
C 樂觀鎖 悲觀鎖 共享鎖 排它鎖 互斥鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。通過 jdbc 實...
mysql樂觀鎖 悲觀鎖 共享鎖與排它鎖
樂觀鎖 樂觀併發控制 和悲觀鎖 悲觀併發控制 是指資料庫在對待併發上控制的兩種思想,共享鎖和排它鎖是具體的鎖的實現,且都屬於悲觀鎖。樂觀鎖沒有加鎖 獲取資料的時候不用獲取鎖,直到需要更新資料的時候才去檢查獲取的記錄是否已被其他事務更新,如果更新了則返回錯誤拋異常。注意的是,樂觀鎖中沒有鎖機制,通常的...
樂觀鎖 悲觀鎖 共享鎖以及排它鎖的概念
樂觀併發控制 又名 樂觀鎖 optimistic concurrency control,縮寫 occ 它假設多使用者併發的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的那部分資料。在提交資料更新之前,每個事務會先檢查在該事務讀取資料後,有沒有其他事務又修改了該資料。如果其...