一:结论
1:普通查詢沒有鎖。
2:查詢可以加共享鎖,如select 。。。 lock in share mode。這樣就加上了共享鎖。
3:查詢可以加排它鎖,如select 。。。 for update。
4:增刪改默認加排它鎖。無需我們顯示指定。
5:行記錄上有排他鎖的時候,也可以被普通查詢查到。但查到的是之前的老數據。
6:若一個查詢中連續加了多個共享鎖,那麼也要等最後一個共享鎖釋放,才能執行排它鎖的操作。(並非同類型的共享鎖都執行完了才執行排他。而是根據FIFO原則執行。見下面的結論)
7:結論6適用於java。
二:实验目的/結論
1:共享鎖要被全部釋放以後,才會執行排它鎖。
2:添加與排它鎖之後的共享鎖,要等待排它鎖執行完畢才會執行
三:实验步骤
对一张表顺序添加ABCD四把锁(其中ABD为S共享锁,C为X排他锁)。且四把锁都处于未commit状态。语句如下
#ABD锁的执行语句
BEGIN;
select * from tb_test LOCK IN SHARE MODE;
#COMMIT;
#C锁的执行语句
BEGIN;
select * from tb_test FOR UPDATE;
#COMMIT;
1:順序執行ABCD的語句,我們會發現,C和D同處於等待狀態。即使D是與AB對同一條記錄添加了同樣的鎖的操作,但是由於在B和D之間有一個C的排它鎖,因此D也要等待。如下圖
2:先將B鎖釋放,發現C和D的狀態未改變。再將A鎖釋放。發現C已被執行,但是D仍然等待
3:再將C鎖釋放,發現D已被執行