zoukankan      html  css  js  c++  java
  • lock tables和unlock tables

    1、lock tables table1 read,table2 read,table3 read

    igoodful@a8-apple-iphone-db00.wh(glc) > show tables;
    +---------------+
    | Tables_in_glc |
    +---------------+
    | mobile        |
    | user          |
    +---------------+
    2 rows in set (0.00 sec)
    
    Fri Dec 20 17:42:35 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > show open tables where in_use >=1;
    +----------+-------+--------+-------------+
    | Database | Table | In_use | Name_locked |
    +----------+-------+--------+-------------+
    | glc      | user  |      1 |           0 |
    +----------+-------+--------+-------------+
    1 row in set (0.00 sec)
    
    Fri Dec 20 17:42:47 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > lock tables user read;                          ######### 添加读锁
    Query OK, 0 rows affected (0.00 sec)
    
    Fri Dec 20 17:43:03 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > show open tables where in_use >=1;              ########## 表明:添加表读锁后,表被用次数加一
    +----------+-------+--------+-------------+
    | Database | Table | In_use | Name_locked |
    +----------+-------+--------+-------------+
    | glc      | user  |      2 |           0 |
    +----------+-------+--------+-------------+
    1 row in set (0.00 sec)
    
    Fri Dec 20 17:43:08 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > select * from user;                             ########## 表明:可以读取锁住的表的数据。
    +------+------+
    | id   | name |
    +------+------+
    |    1 | 1    |
    |    2 | 1    |
    +------+------+
    2 rows in set (0.01 sec)
    
    Fri Dec 20 17:43:37 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > select * from mobile;                            ##########  表明:只能读取锁住的表的数据,不能查看没有锁住的表的数据
    ERROR 1100 (HY000): Table 'mobile' was not locked with LOCK TABLES
    Fri Dec 20 17:44:11 2019
    igoodful@a8-apple-iphone-db00.wh(glc) >

     ########################################

    在另一个会话线程中执行如下语句:

    igoodful@a8-apple-iphone-db00.wh(glc) > select * from user;      ################# 表明:一个会话给表添加了读锁,那么不影响其他会话线程读取该表数据
    +------+------+
    | id   | name |
    +------+------+
    |    1 | 1    |
    |    2 | 1    |
    +------+------+
    2 rows in set (0.00 sec)
    
    Fri Dec 20 17:54:11 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > insert into user values (3,'3');       ################# 表明:一个会话给表添加了读锁,其他会话线程只能对该表进行读取,而不能对该表执行执行dml和ddl语句。
    ^CCtrl-C -- sending "KILL QUERY 233531" to server ...
    Ctrl-C -- query aborted.
    ERROR 1317 (70100): Query execution was interrupted
    Fri Dec 20 17:55:59 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > select connection_id();
    +-----------------+
    | connection_id() |
    +-----------------+
    |          233531 |
    +-----------------+
    1 row in set (0.00 sec)
    
    Fri Dec 20 17:57:07 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > show open tables where in_use>0;;
    +----------+-------+--------+-------------+
    | Database | Table | In_use | Name_locked |
    +----------+-------+--------+-------------+
    | glc      | user  |      2 |           0 |
    +----------+-------+--------+-------------+
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified
    
    Fri Dec 20 17:57:25 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > lock tables user read;       ################# 表明:多个会话线程可以对同一张表添加读锁。
    Query OK, 0 rows affected (0.00 sec)
    
    Fri Dec 20 17:57:57 2019
    igoodful@a8-apple-iphone-db00.wh(glc) >

    一、表的读锁

    如果一个会话线程执行了:lock tables table1  read, table2  read;
    
    则有:
    
    1)、该会话线程只能查询锁定的这几个表(table1,table2)的数据,没有被锁定的表,不能查询其数据
    
    2)、其他事务不能对这两张表进行ddl、dml操作和write表锁
    
    3)、其他会话可以对这两个表添加read锁,即表的读锁是共享锁,可以多个会话线程同时添加,互不影响
    
    4)、这两张表当前被查询使用次数分别增加1,当执行会话执行 unlock tables语句时,这两张表当前被查询使用使用次数分别减1
    igoodful@a8-apple-iphone-db00.wh(glc) > show open tables;
    +--------------------+-------------------+--------+-------------+
    | Database           | Table             | In_use | Name_locked |
    +--------------------+-------------------+--------+-------------+
    | glc                | mobile            |      0 |           0 |
    | mysql              | db                |      0 |           0 |
    | test               | host              |      0 |           0 |
    | performance_schema | session_variables |      0 |           0 |
    | glc                | user              |      2 |           0 |
    | test               | user              |      0 |           0 |
    | mysql              | user              |      0 |           0 |
    +--------------------+-------------------+--------+-------------+
    7 rows in set (0.00 sec)
    
    Fri Dec 20 18:16:10 2019
    igoodful@a8-apple-iphone-db00.wh(glc) >
    
    
    ##################################################################
    1、出现在里面的表,表示的是:这些表都是打开的,且不是临时表。
    2、如果In_use字段为0,则表示该表当前是被打开的状态,但是当前没有被使用。
    3、如果In_use字段为2,则表示该表当前是被打开的状态,且正在被使用次数为2。
    ##################################################################
    
    
    igoodful@a8-apple-iphone-db00.wh(glc) > show open tables;
    +--------------------+-------------------+--------+-------------+
    | Database           | Table             | In_use | Name_locked |
    +--------------------+-------------------+--------+-------------+
    | glc                | mobile            |      0 |           0 |
    | mysql              | db                |      0 |           0 |
    | test               | host              |      0 |           0 |
    | performance_schema | session_variables |      0 |           0 |
    | glc                | user              |      2 |           0 |
    | test               | user              |      0 |           0 |
    | mysql              | user              |      0 |           0 |
    +--------------------+-------------------+--------+-------------+
    7 rows in set (0.00 sec)
    
    Fri Dec 20 18:16:10 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > flush tables;
    Query OK, 0 rows affected (47.94 sec)
    
    Fri Dec 20 18:22:19 2019
    igoodful@a8-apple-iphone-db00.wh(glc) > show open tables;
    Empty set (0.00 sec)
    
    Fri Dec 20 18:23:00 2019
    
    ###########################################################################
    1、flush tables会将缓存的所有表全部清空,即要读取这些表的数据就必须从磁盘加载到缓存。
    2、当缓冲数目已经超过了table_open_cache设置的值,mysql开始使用LRU算法释放表对象。
    3、当缓冲区已满,而连接想要打开一个不在缓冲中的表时。
    ##########################################################

    二、表的写锁

    如果一个会话线程执行了:lock tables table1  write, table2  write;
    
    则有:
    
    1)、该会话线程只能查询锁定的这几个表(table1,table2)的数据,没有被锁定的表,不能查询其数据
    
    2)、其他事务不能对这两张表进行ddl、dml操作、read表锁、write表锁,select读取这两张表也不行,表的写锁是互斥锁。
    
    3)、这两张表当前被查询使用次数分别增加1,当执行会话执行 unlock tables语句时,这两张表当前被查询使用使用次数分别减1

    3、表的解锁

    LOCK TABLES语句为当前会话显式的获取表锁。
    UNLOCK TABLES语句为当前会话显式的释放所有表锁(读写)。
    lock tables与unlock tables只能为自己获取锁和释放锁,不能为其他会话获取锁,也不能释放由其他会话保持的锁。
    一个对象获取锁,需具备该对象上的SELECT权限和LOCK TABLES权限。
    #####################################################################
    ####################################################################
    1、但是当会话发出另外一个LOCK TABLES时,当前会话锁定的所有表会隐式被解锁;
    2、当服务器的连接被关闭时,当前会话锁定的所有表会隐式被解锁;
  • 相关阅读:
    easyUI中textbox或number的数值大小校验
    个人附加作业
    个人最终总结
    结对编程————电梯调度
    visual studio 2013的使用和单元测试
    第三次作业(二)
    团队作业之个人总结篇
    结队编程之总结篇
    电梯调度系统(界面由C图形库编绘)
    软件工程作业单词统计
  • 原文地址:https://www.cnblogs.com/igoodful/p/12074396.html
Copyright © 2011-2022 走看看