前些日子因为项目需要,研究下了为了并发,对表加行锁的问题:
首先如果想对表加入行锁需要该表有索引列,同时加行锁的条件是用索引列做条件的;
所以建立一章带主键的表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行数据加上行锁了.