【MySQL】MySQL 经常使用语法之锁表与解锁表

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,如今看来,锁行的数据不存在时,仍是要当心点,否则容易出现死锁

相关文章
相关标签/搜索