mysql 锁表语句:

Lock锁整张表:

写锁定:

LOCK TABLES products WRITE;

写锁,锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞.....
读锁定:

LOCK TABLES products READ;

读锁,锁定之后,无论是当前线程还是其他线程均只能读操作,写操作全部被堵塞....

 解锁:

UNLOCK TABLES;

行级锁/排他锁 [使用FOR UPDATE]

表需要是InnoDB引擎;

还需要配合事务,否则没有效果[没有事务的话,应该是锁了执行完该句马上又解锁,看不到效果吧];

BEGIN;//启动事务
SELECT * FROM products WHERE id=1 FOR UPDATE;//锁定某一行 where条件需要主键
COMMIT;//事务提交[或者 ROLLBACK 事务回滚]

在启动事务然后锁定某一行后,在事务提交之前或者事务回滚之前该行会一直处于锁定状态,此时只允许当前线程进行读写操作,其他线程只能进行读操作,其他写操作全部被堵塞....

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!

Gap锁,区间锁。

1、当表数据id只有100-200,这100条数据

事务1:

select * from u_table where id=50 for update;

事务2:

insert into u_table(id)values(55);
#select * from u_table where id=55 for update;//无效,测试结论来看以下结论只对insert有效

此时事务2会等待事务1操作完才能执行。(事务2,id=45也等待, 245没有等待)

结论:当锁行数据不存在时,并且事务1,锁的id(50)小于当前表的区间值时。则id小于现有数据的最小id的事务都会锁定。区间锁定在( -∞,100)

2、数据id依然是100-200,这100条数据

直接给结论:当锁行数据不存在时,并且事务1,锁的id(250)大于当前表的区间值时。则id大于现有数据的最大id的事务都会锁定。区间锁定在( 200,+∞)

3、数据id依然是100-200,300-400,这200条数据

直接给结论:当锁行数据不存在时,并且事务1,锁的id(250)在当前表的某一段区间内时。则id在这段区间内的事务都会锁定。区间锁定在( 200,300)

 

PS.以前一直认为行锁,不会影响insert,现在看来,锁行的数据不存在时,还是要小心点,不然容易出现死锁