zoukankan      html  css  js  c++  java
  • 【MySQL】MySQL 常用语法之锁表与解锁表

    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类型的数据表才能支持事务处理!其他的类型是不支持的!

    补充:(2017-10-30)

    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,现在看来,锁行的数据不存在时,还是要小心点,不然容易出现死锁

  • 相关阅读:
    LeetCode_35.搜索插入位置
    LeetCode_349.两个数组的交集
    LeetCode_344.反转字符串
    LeetCode_34.在排序数组中查找元素的第一个和最后一个位置
    LeetCode_303.区域和检索
    LeetCode_3.无重复字符的最长子串
    LeetCode_292.Nim 游戏
    LeetCode_283.移动零
    LeetCode_27.移除元素
    LeetCode_268.丢失的数字
  • 原文地址:https://www.cnblogs.com/mqxs/p/3461928.html
Copyright © 2011-2022 走看看