表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。(共享鎖和排它鎖)
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般
mysql的行級鎖有兩種模式:表共享讀鎖(table read lock)和表獨佔寫鎖
共享鎖:又稱為讀鎖共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。
排他鎖:又稱為寫鎖,排他鎖就是不能與其他鎖並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能再獲取該行的其他鎖,也就是其他事務不能對該條資料加共享鎖和排他鎖,但是獲取排他鎖的事務是可以對資料進行讀取和修改,其他事務也可以進行普通的select 查詢
共享鎖演示:(表的引擎必須是innodb)
加鎖過程
測試鎖的情況
排他鎖演示:
加鎖:加過了排它鎖,就不能對加過鎖的資料上鎖
加過排它鎖就不能進行修改了
加過排它鎖後可以進行普通的查詢
樂觀鎖:
樂觀鎖,顧名思義,對加鎖持有一種樂觀的態度,即先進行業務操作,不到最後一步不進行加鎖,"樂觀"的認為加鎖一定會成功的,在最後一步更新資料的時候在進行加鎖,樂觀鎖的實現方式一般為每一條資料加乙個版本號,具體流程是這樣的
1)、建立一張表時新增乙個version欄位,表示是版本號
2)修改資料的時候首先把這條資料的版本號查出來,update時判斷這個版本號是否和資料庫裡的一致,如果一致則表明這條資料沒有被其他使用者修改,若不一致則表明這條資料在操作期間被其他客戶修改過,此時需要在**中拋異常或者回滾等
悲觀鎖:
1)悲觀鎖對資料加鎖持有一種悲觀的態度。因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改資料)。
2)我們需要set autocommit=0,即不允許自動提交
如果有a、b兩個使用者需要購買id=1的商品,ab都查詢商品數量是1000,a購買後修改商品的數量為999,b購買後修改數量為999。
用樂觀鎖的解決方案:
每次獲取商品時,不對該商品加鎖。在更新資料的時候需要比較程式中的庫存量與資料庫中的庫存量是否相等,如果相等則進行更新,反之程式重新獲取庫存量,再次進行比較,直到兩個庫存量的數值相等才進行資料更新
mysql鎖機制 mysql 鎖機制
一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...
mysql鎖機制總結 mysql鎖機制總結
1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...
mysql 鎖機制 行 字段 MySql鎖機制
鎖跟事務有關 一 共享鎖 讀鎖 s鎖 1.多個事務的查詢語句,對同一資料,可以共享一把鎖,都能訪問到最新資料 2.如果只有乙個事務獲取到了乙個共享鎖,可以更新 刪除 3.如果多個事務都獲取到了同乙個共享鎖,多個事務都不可以更新 刪除 4.使用場景 多個事務都可以獲取最新資料 二 排它鎖 寫鎖 x鎖 ...