mysql事務處理與鎖機制

給我一瓶冰闊洛發表於2020-12-14

事務對鎖的影響

表結構
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
 `nickname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

使用者A:開啟事務 修改ID = 1 的資料  ,未提交事務

set autocommit = 0; 開啟事務
UPDATE `user` set name = 111 where id = 1;

使用者B : 修改ID = 1的資料,則會阻塞,只有當A提交事務B使用者才會執行

UPDATE `user` set name = 999 where id = 1; 等待
UPDATE `user` set name = 999 where id = 2;  執行成功 無需等待

--------------------------------------------------------
set autocommit = 0; 開啟事務
UPDATE `user` set name = 111 where nickname = 'lisi'; //nickname有索引則行鎖,無索引則表鎖

結論:事務產生鎖;事務中使用列如果有索引則會產生行鎖,沒有索引則產生表鎖

 

mysql範圍查詢對鎖的影響

set autocommit = 0;
UPDATE `user` set name = 111 where id >1 and id < 5 ;
#未提交事務
#鎖定id >1 and id < 5 之間的資料,
#ID在id >1 and id < 5 之間的curd操作都會等待事務提交後才會執行

 

 

 

 

 

 

 

 

 

 

 

 

相關文章