mysql行級鎖定實作原理:1、InnoDB行鎖是透過給索引項加鎖來實現的,這一點mysql和 oracle不同;2、InnoDB這種行級鎖決定,只有透過索引條件來檢索數據,才能使用行級鎖,否則, 直接使用表級鎖。
mysql行級鎖定實作原理:
鎖定是在執行多執行緒時用於強行限定資源訪問的同步機制,資料庫鎖依鎖的粒度可分為行級鎖, 表級鎖定和頁級鎖定
行級鎖定
行級鎖定是mysql中粒度最細的一種鎖定機制,表示只對目前所操作的行進行加鎖,行級鎖發生衝突 的機率很低,其粒度最小,但是加鎖的代價最大。行級鎖分為共享鎖和排他鎖。
特點:
開銷大,加上鎖慢,會出現死鎖;鎖定粒度最小,發生鎖定衝突的機率最大,並發性也高;
實作原理:
InnoDB行鎖定是透過在索引項上加上鎖定來實現的,這一點mysql和oracle不同,後者是透過在資料庫中 對應的資料行加鎖來實現的,InnoDB這種行級鎖定決定,只有透過索引條件來檢索數據,才能使用行 級鎖,否則,直接使用表級鎖。
特別注意: 使用行級鎖定一定要使用索引
舉個栗子:
#建立表格結構
CREATE TABLE `developerinfo` ( `userID` bigint(20) NOT NULL, `name` varchar(255) DEFAULT NULL, `passWord` varchar(255) DEFAULT NULL, PRIMARY KEY (`userID`), KEY `PASSWORD_INDEX` (`passWord`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入資料
INSERT INTO `developerinfo` VALUES ('1', 'liujie', '123456'); INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123'); INSERT INTO `developerinfo` VALUES ('3', 'tong', '123456');
(1)透過主鍵索引來查詢資料庫使用行鎖
開啟三個命令列視窗進行測試
命令列視窗1 | #命令列視窗2 | 命令列窗口3 |
mysql> set autocommit = 0; Query OK, 0 rows affected mysql> select * from developerinfo where userid = '1' for update; -------- -------- ---------- | userID | name | passWord | ------- - -------- ---------- | 1 | liujie | 123456 | -------- -------- ---------- 1 row in set |
mysql> set autocommit = 0; Query OK, 0 rows affected mysql> select * from developerinfo where userid = '1' for update; 等待 |
mysql> set autocommit = 0; Query OK, 0 rows affected mysql> select * from developerinfo where userid = '3' for update; -------- ------ ---------- | userID | name | passWord | -------- ------ ---------- | 3 | tong | 123456 | -------- ------ ---------- 1 row in set |
mysql>
commit; Query OK, 0 rows affected |
mysql> select * from
developerinfo where userid = '1' for update; -------- -------- ---------- | userID | name | passWord | # -------- ------- - ---------- | 1 | liujie | 123456 | -------- -------- ---------- 1 row in set |
(2)查詢非索引的欄位來查詢資料庫使用行鎖
開啟兩個命令列視窗進行測試
#命令列視窗1 | 命令列視窗2 |
mysql> set autocommit=0; Query OK, 0 rows affected mysql> select * from developerinfo where name = 'liujie' for update; -------- -------- ---------- | userID | name | passWord | -------- -------- ---------- | 1 | liujie | 123456 | -------- -------- ---------- 1 row in set |
mysql> set
autocommit=0; Query OK, 0 rows affected mysql> select * from developerinfo where name = 'tong' for update; 等待 |
#mysql> commit; Query OK, 0 rows affected |
# mysql> select * from developerinfo where name = 'liujie' for
update; -------- -------- ---------- | userID | name | passWord | ------ -- -------- ---------- | 1 | liujie | 123456 | -------- -------- - --------- 1 row in set |
(3)查詢非唯一索引欄位來查詢資料庫使用行鎖鎖住多行
mysql的行鎖是針對索引假的鎖,不是針對記錄,所以可能會出現鎖住不同記錄的場景
開啟三個命令列視窗進行測試
命令列視窗1 | 命令列視窗2 | |
命令列視窗2 #命令列視窗3 mysql> set autocommit=0; Query OK, 0 rows affected mysql> select * from developerinfo where password = '123456 ' for update; -------- -------- ---------- | | userID | name | passWord | --------
-------- ---------- | 1 | liujie | 123456 | | 3 | tong | 123456 | -------- -------- ---------- 2 rows in setmysql> set autocommit =0 ; | Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '1' for update; 等待 mysql> set autocommit = 0; Query OK, 0 rows affected mysql> select * from developerinfo where userid = '2 ' for update; | -------- -------- ----------
| 2 | yitong | 123 | | -------- -------- ----------1 row in set #commit ; mysql> select * from developerinfo where userid = '1' for update; | -------- -------- ---------- | userID | name | passWord | ------ -- -------- ---------- | | 1 | liujie | 123456 |
mysql教學######(影片)##############(4)條件中使用索引來操作檢索資料庫時,是否使用索引還需有mysql透過判斷不同執行計畫來 決定,是否使用該索引,如需判定如何使用explain來判斷索引,請聽下回分解更多相關免費學習推薦:
以上是mysql行級鎖實作原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!