广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中Lock Tables和Unlock Tables的作用是什么
  • 548
分享到

MySQL中Lock Tables和Unlock Tables的作用是什么

2024-04-02 19:04:59 548人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关Mysql中Lock Tables和Unlock Tables的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。锁定表的语法:L

这期内容当中小编将会给大家带来有关Mysql中Lock Tables和Unlock Tables的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

锁定表的语法:

LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRioRITY] WRITE} [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...

LOCAL修饰符表示可以允许在其他会话中对在当前会话中获取了READ的的表执行插入。但是当保持锁时,若使用Server外的会话来操纵数据库则不能使用READ  LOCAL。另外,对于InnoDB表,READ LOCAL与READ相同。

  • The LOCAL modifier enables nonconflicting INSERT statements (concurrent  inserts) by other sessions to execute while the lock is held. (See Section  8.11.3, “Concurrent Inserts”.) However, READ LOCAL cannot be used if you are  Going to manipulate the database using processes external to the server while  you hold the lock. For InnoDB tables, READ LOCAL is the same as READ.

修饰符LOW_PRIORITY用于之前版本的mysql,它会影响锁定行为,但是从Mysql  5.6.5以后,这个修饰符已经被弃用。如果使用它则会产生警告。

[LOW_PRIORITY] WRITE lock:  The session that holds the lock can read and write the table.  Only the session that holds the lock can access the table. No other session can access it until the lock is released.  Lock requests for the table by other sessions block while the WRITE lock is held.  The LOW_PRIORITY modifier has no effect. In previous versions of MySQL, it affected locking behavior, but this is no longer true. As of MySQL 5.6.5, it is deprecated and its use produces a warning. Use WRITE without LOW_PRIORITY instead.

解锁表的语法:

UNLOCK TABLES

LOCK TABLES为当前会话锁定表。UNLOCK TABLES释放被当前会话持有的任何锁。官方文档“13.3.5 LOCK TABLES and  UNLOCK TABLES Syntax”已经对LOCK TALES与UNLOCK  TABLES做了不少介绍,下面我们通过一些测试例子来深入的理解一下锁表与解锁表的相关知识点。我们先准备一下测试环境用的表和数据。

mysql> create table test( id int, name varchar(12)); Query OK, 0 rows affected (0.07 sec)  mysql> insert into test     -> select 10001, 'kerry'   uNIOn all     -> select 10002, 'richard' union all     -> select 10003, 'jimmy' ; Query OK, 3 rows affected (0.05 sec) Records: 3  Duplicates: 0  Warnings: 0  mysql>

当前会话(会话ID为61)持有test表的READ锁后,那么当前会话只可以读该表,而不能往表中写入数据,否则就会报“Table 'test' was  locked with a READ lock and can't be updated”这样的错误。

注意:如果使用LOCK TABLE WRITE锁定表后,则可以更新数据。详见后面介绍

mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              61 | +-----------------+ 1 row in set (0.00 sec)  mysql> show open tables where in_use >=1; Empty set (0.00 sec)  mysql> lock tables test read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test  |      1 |           0 | +----------+-------+--------+-------------+ 1 row in set (0.01 sec)  mysql> select * from test; +-------+---------+ | id    | name    | +-------+---------+ | 10001 | kerry   | | 10002 | richard | | 10003 | jimmy   | +-------+---------+ 3 rows in set (0.00 sec)  mysql> insert into test     -> values(10004, 'ken'); ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated mysql>

MySQL中Lock Tables和Unlock Tables的作用是什么

其它会话也能查询表test,但是不能修改表,如果执行DML操作的话,则会一直处于被阻塞状态(Waiting for table metadata  lock)。

另外,我们测试一下修饰符LOCAL的用途,如下所示:

mysql> create table test2( id int , name varchar(12)) engine=MyISAM; Query OK, 0 rows affected (0.05 sec)  mysql> insert into test2     -> select 1001, 'test'; Query OK, 1 row affected (0.00 sec) Records: 1  Duplicates: 0  Warnings: 0 mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              66 | +-----------------+ 1 row in set (0.00 sec)  mysql> lock tables test2 read local; Query OK, 0 rows affected (0.00 sec)  mysql> select * from test2; +------+------+ | id   | name | +------+------+ | 1001 | test | +------+------+ 1 row in set (0.00 sec)  mysql> insert into test2     -> select 1002, 'kkk'; ERROR 1099 (HY000): Table 'test2' was locked with a READ lock and can't be updated mysql>

但是在其它会话当中,你可以看到表test2可以被插入。当然前提是表的存储引擎不能是innodb引擎,否则使用修饰符LOCAL和不用LOCAL是一样的,其它会话无法对表写入。

mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              65 | +-----------------+ 1 row in set (0.00 sec)  mysql> select * from test2; +------+------+ | id   | name | +------+------+ | 1001 | test | +------+------+ 1 row in set (0.00 sec)  mysql> insert into test2     -> select 1002, 'kkk'; Query OK, 1 row affected (0.00 sec) Records: 1  Duplicates: 0  Warnings: 0

那么其他会话是否也能读此表呢? 其它会话能否也能锁定该表(LOCK TABLES READ LOCAL)?其它会话是否也能锁定写(LOCK TABLE  WRITE)呢?。关于这些疑问,其它会话也能读此表,其它表也能锁定该表(LOCK TABLES READ LOCAL),但是不能LOCK TABLE  WRITE。

对于MyISAM表,现在用的比较少,我们还是用InnoDB类型的表来实验一下,在其中一个会话使用lock table锁定表test,

mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              61 | +-----------------+ 1 row in set (0.00 sec)  mysql> lock table test read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test  |      1 |           0 |

然后在会话62中进行下面测试:

mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              62 | +-----------------+ 1 row in set (0.01 sec)  mysql> select * from test; +-------+---------+ | id    | name    | +-------+---------+ | 10001 | kerry   | | 10002 | richard | | 10003 | jimmy   | +-------+---------+ 3 rows in set (0.00 sec)  mysql> lock tables test read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test  |      2 |           0 | +----------+-------+--------+-------------+ 1 row in set (0.00 sec)  mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test  |      1 |           0 | +----------+-------+--------+-------------+ 1 row in set (0.00 sec)  mysql> lock tables test write;

MySQL中Lock Tables和Unlock Tables的作用是什么

如上测试所示,如果一个会话在一个表上获得一个READ锁后,所有其他会话只能从表中读。不能往表中写,其它会话也可在该表上获取一个READ锁,此时你会在show  open tables里面看到in_use的值增加。其实LOCK TABLES  READ是一个表锁,而且是共享锁。但是当一个会话获取一个表上的READ锁后,其它会话就不能获取该表的WRITE锁了,此时就会被阻塞,直到持有READ锁的会话释放READ锁。

MySQL中Lock Tables和Unlock Tables的作用是什么

该会话(会话61)中则可以继续获取WRITE锁。当该会话获取WRITE锁后,其它会话则无法获取READ锁了

mysql> lock table test write; Query OK, 0 rows affected (0.00 sec)

另外需要注意的是,当前会话如果锁定了其中一个表,那么是无法查询其它表的。否则会报“ERROR 1100 (HY000): Table 'worklog'  was not locked with LOCK TABLES”错误。

MySQL中Lock Tables和Unlock Tables的作用是什么

那么我们再来看看WRITE锁吧。测试前,先在上面两个会话中执行 unlock  tables命令。然后获得表TEST上的一个WRITE锁,如下所示,当前会话可以读写表TEST

mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)  mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              61 | +-----------------+ 1 row in set (0.00 sec)  mysql> show open tables where in_use >=1; Empty set (0.00 sec)  mysql> lock tables test write; Query OK, 0 rows affected (0.00 sec)  mysql> select * from test; +-------+---------+ | id    | name    | +-------+---------+ | 10001 | kerry   | | 10002 | richard | | 10003 | jimmy   | +-------+---------+ 3 rows in set (0.00 sec)  mysql> update test set name='ken' where id=10003; Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0  mysql>

其它会话无法读写表TEST,都会被阻塞,当然也无法获取表TEST的READ锁或WRITE锁。也就是说当一个会话获得一个表上的一个WRITE锁后,那么只有持锁的会话才能READ或WRITE表,其他会话都会被阻止。

mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)  mysql>  mysql>  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test  |      1 |           0 | +----------+-------+--------+-------------+ 1 row in set (0.00 sec)  mysql> select * from test;

MySQL中Lock Tables和Unlock Tables的作用是什么

mysql> select connection_id(); +-----------------+ | connection_id() | +-----------------+ |              63 | +-----------------+ 1 row in set (0.00 sec)  mysql> show processlist; +----+------+-----------+------+---------+------+---------------------------------+--------------------+ | Id | User | Host      | db   | Command | Time | State                           | Info               | +----+------+-----------+------+---------+------+---------------------------------+--------------------+ | 61 | root | localhost | MyDB | Sleep   |   86 |                                 | NULL               | | 62 | root | localhost | MyDB | Query   |   40 | Waiting for table metadata lock | select * from test | | 63 | root | localhost | MyDB | Query   |    0 | init                            | show processlist   | | 64 | root | localhost | MyDB | Sleep   | 2551 |                                 | NULL               | +----+------+-----------+------+---------+------+---------------------------------+--------------------+ 4 rows in set (0.00 sec)

UNLOCK TABLES释放被当前会话持有的任何锁,但是当会话发出另外一个LOCK  TABLES时,或当服务器的连接被关闭时,当前会话锁定的所有表会隐式被解锁。下面我们也可以测试看看

mysql> lock tables test read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test  |      1 |           0 | +----------+-------+--------+-------------+ 1 row in set (0.00 sec)  mysql> lock tables worklog read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+---------+--------+-------------+ | Database | Table   | In_use | Name_locked | +----------+---------+--------+-------------+ | MyDB     | worklog |      1 |           0 | +----------+---------+--------+-------------+ 1 row in set (0.00 sec)  mysql>

MySQL中Lock Tables和Unlock Tables的作用是什么

那么我们如何在当前会话锁定多个表呢?如下所示:

mysql> show open tables where in_use >=1; Empty set (0.00 sec)  mysql> lock tables test read, worklog read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+---------+--------+-------------+ | Database | Table   | In_use | Name_locked | +----------+---------+--------+-------------+ | MyDB     | worklog |      1 |           0 | | MyDB     | test    |      1 |           0 | +----------+---------+--------+-------------+ 2 rows in set (0.00 sec)  mysql>

另外,还有一些细节问题,LOCK TABLES是否可以为视图、触发器、临时表加锁呢?

mysql> create table test2( id int, sex bit); Query OK, 0 rows affected (0.06 sec)  mysql> insert into test2     -> select 10001, 1 union all     -> select 10002, 0 union all     -> select 10003, 1; Query OK, 3 rows affected (0.02 sec) Records: 3  Duplicates: 0  Warnings: 0 mysql> create view v_test     -> as     -> select t1.id, t1.name, t2.sex     -> from test t1 left join test2 t2 on t1.id =t2.id; Query OK, 0 rows affected (0.01 sec) mysql> lock tables v_test read; Query OK, 0 rows affected (0.00 sec)  mysql> show open tables where in_use >=1; +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | MyDB     | test2 |      1 |           0 | | MyDB     | test  |      1 |           0 | +----------+-------+--------+-------------+ 2 rows in set (0.00 sec)  mysql>

如上测试所示,对于VIEW加锁,LOCK TABLES语句会为VIEW中使用的所有基表加锁。对触发器使用LOCK  TABLE,那么就会锁定触发器中所包含的全部表(any tables used in triggers are also locked  implicitly)

mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)  mysql> create temporary table tmp like test; Query OK, 0 rows affected (0.04 sec)  mysql> show open tables where in_use >=1; Empty set (0.00 sec)  mysql> select database(); +------------+ | database() | +------------+ | MyDB       | +------------+ 1 row in set (0.00 sec)  mysql> select * from tmp; Empty set (0.00 sec)  mysql> insert into tmp     -> select 1001, 'kerry' ; Query OK, 1 row affected (0.01 sec) Records: 1  Duplicates: 0  Warnings: 0  mysql>

LOCK TABLES 与 UNLOCK  TABLES只能为自己获取锁和释放锁,不能为其他会话获取锁,也不能释放由其他会话保持的锁。一个对象获取锁,需具备该对象上的SELECT权限和LOCK  TABLES权限。LOCK TABLES语句为当前会话显式的获取表锁。最后,关于LOCK TABLES与事务当中锁有那些异同,可以参考官方文档:

LOCK TABLES and UNLOCK TABLES interact with the use of transactions as  follows:

  • LOCK TABLES is not transaction-safe and implicitly commits any active  transaction before attempting to lock the tables.

  • ·UNLOCK TABLES implicitly commits any active transaction, but only if LOCK  TABLES has been used to acquire table locks. For example, in the following set  of statements,UNLOCK TABLES releases the global read lock but does not commit  the transaction because no table locks are in effect:

上述就是小编为大家分享的MySQL中Lock Tables和Unlock Tables的作用是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中Lock Tables和Unlock Tables的作用是什么

本文链接: https://www.lsjlt.com/news/57839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中Lock Tables和Unlock Tables的作用是什么
    这期内容当中小编将会给大家带来有关MySQL中Lock Tables和Unlock Tables的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。锁定表的语法:L...
    99+
    2022-10-18
  • MySQL 5.5中LOCK TABLES和UNLOCK TABLES语句有哪些
    这篇文章主要介绍了MySQL 5.5中LOCK TABLES和UNLOCK TABLES语句有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一...
    99+
    2022-10-18
  • 怎么理解mysql中FLUSH TABLES和FLUSH TABLES WITH READ LOCK
    这篇文章主要讲解了“怎么理解mysql中FLUSH TABLES和FLUSH TABLES WITH READ LOCK”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研...
    99+
    2022-10-18
  • MySQLump中Lock-Tables参数的作用是什么
    MySQLump中Lock-Tables参数的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。mysqldump有一个参数--lo...
    99+
    2022-10-18
  • PostgreSQL中Pluggable storage for tables的实现方法是什么
    这篇文章主要讲解了“PostgreSQL中Pluggable storage for tables的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学...
    99+
    2022-10-18
  • C# 中lock关键字的作用是什么
    这篇文章将为大家详细讲解有关C# 中lock关键字的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical se...
    99+
    2023-06-18
  • Metadata Lock在MySQL数据库中有什么作用
    下文主要给大家带来Metadata Lock在MySQL数据库中有什么作用,希望这些内容能够带给大家实际用处,这也是我编辑Metadata Lock在MySQL数据库中有什么作用这篇文章的主要目的。好了,废...
    99+
    2022-10-18
  • Java中Lock和Synchronized的区别是什么
    这篇文章主要讲解了“Java中Lock和Synchronized的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Lock和Synchronized的区别是什么”吧!1. ...
    99+
    2023-06-30
  • mysql中datetime和timestamp的作用是什么
    本篇文章给大家分享的是有关mysql中datetime和timestamp的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 DAT...
    99+
    2022-10-18
  • mysql和oracle中函数的作用是什么
    这篇文章给大家介绍mysql和oracle中函数的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  一、nvl()函数:  (1)oracle中的nvl()函数:  语法: ...
    99+
    2022-10-18
  • MySQL中事务和ACID的作用是什么
    今天就跟大家聊聊有关MySQL中事务和ACID的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。所谓事务(Transaction),就是通过...
    99+
    2022-10-18
  • MySQL中character_set_client的作用是什么
    character_set_client是MySQL中的一个系统变量,用于设置客户端连接到服务器时所使用的字符集。它指定了客户端发送...
    99+
    2023-09-06
    MySQL
  • MySQL 中MRR的作用是什么
    MySQL 中MRR的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。执行一个范围查询:mysql > ex...
    99+
    2022-10-18
  • mysql中LAST_INSERT_ID()的作用是什么
    本篇文章为大家展示了mysql中LAST_INSERT_ID()的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 首先看mysql中的LAST_...
    99+
    2022-10-18
  • mysql中in的作用是什么
    本篇内容介绍了“mysql中in的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • MySql中delimiter的作用是什么
    MySql中delimiter的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 MYSQL导出一个SQL后:DELIMITER&...
    99+
    2022-10-18
  • Mysql中row_format的作用是什么
    本篇文章给大家分享的是有关Mysql中row_format的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Mysql的row_for...
    99+
    2022-10-18
  • MySQL中Timeout的作用是什么
    今天就跟大家聊聊有关MySQL中Timeout的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。connect_timeout、intera...
    99+
    2022-10-18
  • mysql中str_to_date的作用是什么
    小编给大家分享一下mysql中str_to_date的作用是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql中的st...
    99+
    2022-10-18
  • mysql中distinct的作用是什么
    本篇文章给大家分享的是有关mysql中distinct的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  1.在count 不重复的...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作