国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Mysql鎖的行級鎖和表級意向鎖

2024-07-24 12:32:33
字體:
來源:轉載
供稿:網友
      Innodb存儲引擎實現了兩種行級鎖:
 
      關于行級鎖比較容易理解。下面介紹一下表級意向鎖。
 
      Innodb存儲引擎支持多粒度的鎖定,換句話說,允許事務在表級和行級上同時持有鎖。意向鎖是一種表級鎖,它是由存儲引擎自己維護的,不需要用戶手動命令干預。如果事務想要給表中幾行數據加上行級共享鎖,那么需要先在表級別加上意向共享鎖(IS);如果事務想要給表中幾行數據加上行級排他鎖,那么需要先在表級別加上意向排他鎖(IX)。那么這兩種表級鎖有什么意義呢?
 
比如存在這樣一種情況。一個會話A開啟如下事務,在表中的一行上面加上一行排他鎖,并且沒有提交。
 
mysql>   begin;
 
Query OK, 0   rows affected (0.00 sec)
  
mysql>   SELECT * FROM t_compact WHERE c1 = 'a' FOR UPDATE;
 
+------+------+------+
 
| c1   | c2     | c3   |
 
+------+------+------+
 
| a    | aa     | aaa  |
 
+------+------+------+
 
1 row in set   (0.00 sec)
 
會話B需要給表加一個讀鎖,比如lock tables t_compact read;那么就要在表級別加共享鎖。加鎖之前需要確認一件事,那就是表中的所有的行上面都沒有排他鎖,否則會出現行鎖和表鎖的共存沖突問題。如果沒有表級意向鎖的話,那么會話B需要去每一行檢查是否存在行級排他鎖,所以意向表級鎖就是用來縮短這個檢查過程的。它將檢查每一行的排他鎖變成了只要檢查一個表級鎖就可以了。
 
存在意向鎖之后,整個過程變成了這樣:會話A在以排他鎖鎖住一行之前,需要先加一個表級別的意向排他鎖,成功之后再在需要鎖住的那一行上面加行級排他鎖。這時會話B需要在表級別加共享鎖,這時它發現表上已經存在意向排他鎖,那么說明表中已經有數據行上有行級排他鎖,那么會話B就需要等待。
 
表級意向鎖相互之間是完全兼容的。
 
關于表級意向鎖互相兼容,下面的列子可以幫助理解。
 
仍然是表t_compact,注意表上存在一個主鍵
 
mysql> show create table t_compact/G
 
*************************** 1. row   ***************************
 
         Table: t_compact
 
Create Table: CREATE TABLE `t_compact` (
 
    `c1` varchar(10) NOT NULL,
 
    `c2` char(10) DEFAULT NULL,
 
    `c3` varchar(10) DEFAULT NULL,
 
    PRIMARY KEY (`c1`)
 
) ENGINE=InnoDB DEFAULT CHARSET=utf8
 
1 row in set (0.00 sec)
 
會話A,在一行上即行級排他鎖
 
mysql> begin;
 
Query OK, 0 rows affected (0.00 sec)
  
mysql> select * FROM t_compact WHERE   c1 = 'a' FOR UPDATE;
 
+----+------+------+
 
| c1 | c2   | c3     |
 
+----+------+------+
 
| a    | aa   | aaa  |
 
+----+------+------+
 
1 row in set (0.00 sec)
  
會話B,在另一行上加行級排他鎖。由于會話A的緣故,表上已經存在意向排他鎖,會話B也需要在表上加意向排他鎖,由于意向鎖的兼容性,意向排他鎖也是可以加的上去的。下面再去檢查c1 = 'b'行上有沒有行級排他鎖,經檢查沒有行級排他鎖,那么c1 = 'b'上加行級排他鎖,不會阻塞。
 
可是如果會話B也要在c1 = 'a'上加行級排他鎖,那么加完意向排他鎖之后,檢查行級排他鎖就會發現已經存在,那么就會被阻塞。
 
所以,這種兼容性有助于提高并發能力。
 
mysql> begin;
 
Query OK, 0 rows affected (0.00 sec)
  
 
mysql> select * FROM t_compact WHERE   c1 = 'b' FOR UPDATE;
 
+----+------+------+
 
| c1 | c2   | c3     |
 
+----+------+------+
 
| b    | bb   | bbb  |
 
+----+------+------+
 
1 row in set (0.00 sec)
  

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 六枝特区| 凌海市| 乡宁县| 阿图什市| 屏南县| 东港市| 海城市| 关岭| 绥江县| 淮南市| 云和县| 睢宁县| 通化市| 温宿县| 娄底市| 宝山区| 双江| 章丘市| 嘉兴市| 梓潼县| 石楼县| 靖安县| 建水县| 黑山县| 扎鲁特旗| 上饶市| 德惠市| 宾阳县| 云南省| 夹江县| 广昌县| 视频| 平凉市| 黑水县| 商丘市| 黔东| 疏附县| 涞源县| 甘德县| 白沙| 平罗县|