概述:
共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。
排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對資料就行讀取和修改。
對於共享鎖大家可能很好理解,就是多個事務只能讀資料不能改資料,對於排他鎖大家的理解可能就有些差別,我當初就犯了乙個錯誤,以為排他鎖鎖住一行資料後,其他事務就不能讀取和修改該行資料,其實不是這樣的。排他鎖指的是乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖。mysql innodb引擎預設的修改資料語句,update,delete,insert都會自動給涉及到的資料加上排他鎖,select語句預設不會加任何鎖型別,如果加排他鎖可以使用select ...for update語句,加共享鎖可以使用select ... lock in share mode語句。所以加過排他鎖的資料行在其他事務種是不能修改資料的,也不能通過for update和lock in share mode鎖的方式查詢資料,但可以直接通過select ...from...查詢資料,因為普通查詢沒有任何鎖機制。
總結:
1排他鎖和其他鎖不能共存
2innodb引擎.預設對update,delete,insert加排他鎖,select語句預設不加鎖
3共享鎖可以和其他鎖共存
測試:
我們有如下測試資料
現在我們對id=1的資料行排他查詢,這裡會使用begin開啟事務,而不會看見我關閉事務,這樣做是用來測試,因為提交事務或回滾事務就會釋放鎖。
開啟乙個查詢視窗
會查詢到一條資料,現在開啟另乙個查詢視窗,對同一資料分別使用排他查和共享鎖查詢兩種方式查詢
排他查
共享查
我們看到開了排他鎖查詢和共享鎖查詢都會處於阻塞狀態,因為id=1的資料已經被加上了排他鎖,此處阻塞是等待排他鎖釋放。
如果我們直接使用以下查詢呢
我們看到是可以查詢到資料的。
我們再看一下乙個事務獲取了共享鎖,在其他查詢中也只能加共享鎖或不加鎖。
我們看到是可以查詢資料的,但加排他鎖就查不到,因為排他鎖與共享鎖不能存在同一資料上。
最後我們驗證下上面說的mysql innodb引擎中update,delete,insert語句自動加排他鎖的問題,
此時共享查詢處於阻塞,等待排它鎖的釋放,但是用普通查詢能查到資料,因為沒用上鎖機制不與排他鎖互斥,但查到的資料是修改資料之前的老資料。
然後我們提交資料,釋放排他鎖看下修改後的資料,此時可用排他查,共享查和普通查詢, 因為事務提交後該行資料釋放排他鎖,下面就只顯示普通查詢,其他的同學們自己去驗證。
可以看到結果與預期的一樣。
mysql悲觀鎖中的共享鎖和排他鎖
概述 共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事...
mysql樂觀鎖 悲觀鎖 共享鎖與排它鎖
樂觀鎖 樂觀併發控制 和悲觀鎖 悲觀併發控制 是指資料庫在對待併發上控制的兩種思想,共享鎖和排它鎖是具體的鎖的實現,且都屬於悲觀鎖。樂觀鎖沒有加鎖 獲取資料的時候不用獲取鎖,直到需要更新資料的時候才去檢查獲取的記錄是否已被其他事務更新,如果更新了則返回錯誤拋異常。注意的是,樂觀鎖中沒有鎖機制,通常的...
樂觀鎖 悲觀鎖 共享鎖和排它鎖的簡單理解
個人簡單理解 樂觀鎖 樂觀併發控制 和悲觀鎖 悲觀併發控制 是指資料庫在對待併發上控制的兩種思想,共享鎖和悲觀鎖是具體的鎖的實現,且都屬於悲觀鎖。樂觀鎖沒有加鎖 2.排它鎖 x 寫鎖 一旦被上上排它鎖 x 該事務可進行讀寫操作,其他事務只能等到該事務釋放了鎖後才能獲取鎖 這兩種鎖都是在進行資料操作是...