專案中遇到的MySql行鎖與併發性關係(1)

hunterdahe發表於2014-05-15

前些日子因為專案需要,研究下了為了併發,對錶加行鎖的問題:

首先如果想對錶加入行鎖需要該表有索引列,同時加行鎖的條件是用索引列做條件的;

所以建立一章帶主鍵的表TEST_ALR:

CREATE TABLE TEST_ALR
(
   ID                   INT NOT NULL AUTO_INCREMENT,
   NAME 		VARCHAR(30),
   PRIMARY KEY (ID)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;
然後在連線1中加事務和往表中插入資料:

SET autocommit=0;
INSERT INTO TEST_ALR (NAME) VALUES ('張三'),('李四'),('王五'),('趙六'),('孫七');
在當前連線中檢視資料:

SELECT * FROM TEST_ALR;
結果:
ID	name
1	張三
2	李四
3	王五
4	趙六
5	孫七

此時同時在連線2,3,4中插入不同的資料:

連線2:
INSERT INTO TEST_ALR (ID) VALUES (1);
Error Code : 1205
Lock wait timeout exceeded; try restarting transaction
連線3:
INSERT INTO TEST_ALR (ID) VALUES (6);
1 row(s) affected
連線4:
INSERT INTO TEST_ALR (NAME) VALUES ('test');
1 row(s) affected

在連線4中查詢表TEST_ALR:

ID NAME
6 NULL
7 test

說明連線1中的INSERT雖然沒有提交,但是此時已經把ID在1-5範圍的5行資料加上行鎖了.



相關文章