mysql 锁表语句:mysql
Lock锁整张表:sql
写锁定:测试
LOCK TABLES products WRITE;
写锁,锁定以后,只有当前线程能够进行读操做和写操做,其余线程读操做和写操做均被堵塞.....
读锁定:spa
LOCK TABLES products READ;
读锁,锁定以后,不管是当前线程仍是其余线程均只能读操做,写操做所有被堵塞....线程
解锁:code
UNLOCK TABLES;
行级锁/排他锁 [使用FOR UPDATE]:blog
表须要是InnoDB引擎;事务
还须要配合事务,不然没有效果[没有事务的话,应该是锁了执行完该句立刻又解锁,看不到效果吧];table
BEGIN;//启动事务 SELECT * FROM products WHERE id=1 FOR UPDATE;//锁定某一行 where条件须要主键 COMMIT;//事务提交[或者 ROLLBACK 事务回滚]
在启动事务而后锁定某一行后,在事务提交以前或者事务回滚以前该行会一直处于锁定状态,此时只容许当前线程进行读写操做,其余线程只能进行读操做,其余写操做所有被堵塞....class
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其余的类型是不支持的!
补充:(2017-10-30)
Gap锁,区间锁。
一、当表数据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)
二、数据id依然是100-200,这100条数据
直接给结论:当锁行数据不存在时,而且事务1,锁的id(250)大于当前表的区间值时。则id大于现有数据的最大id的事务都会锁定。区间锁定在( 200,+∞)
三、数据id依然是100-200,300-400,这200条数据
直接给结论:当锁行数据不存在时,而且事务1,锁的id(250)在当前表的某一段区间内时。则id在这段区间内的事务都会锁定。区间锁定在( 200,300)
PS.之前一直认为行锁,不会影响insert,如今看来,锁行的数据不存在时,仍是要当心点,否则容易出现死锁