lock mysql unlock_MySQL中的lock tables和unlock tables

MySQL允许客户端会话显式地获取表锁,以便与其他会话协作访问表,或者防止其他会话在其需要独占表时使用表。这个能力就是通过LOCK TABLES和UNLOCK TABLES实现的。

LOCK TABLES用于显示的获取表锁,UNLOCK TABLES显式释放当前会话持有的任何表锁。

MySQL 5.7版本中它们的完整语法是:

LOCK TABLES

tbl_name [[AS] alias] lock_type

[, tbl_name [[AS] alias] lock_type] …

lock_type: {

READ [LOCAL]

| [LOW_PRIORITY] WRITE

}

UNLOCK TABLES

LOCK TABLES可以为基表或视图获取表锁。必须具有要锁定的每个对象的“LOCK TABLES”权限和“SELECT”权限。

不同的锁类型有不同的效果。

READ [LOCAL]锁:

持有锁的会话可以读取表(但不能写入表)。

多个会话可以同时获取表的read锁。

其它会话可以在不显式获取读锁的情况下读取表。

加上LOCAL关键字,表示在持有锁的同时允许其它会话执行非冲突插入语句(并发插入)。但是,如果要在持有锁的同时使用外部进程操作数据库,则不能使用READ LOCAL。对于InnoDB表,READ LOCAL与READ相同。

会话1登入,并修改提示符包含session1字样,然后对emp表读取,可以进行,然后用lock tables给emp表加read锁定。

root@database-one 13:57: [(none)]> prompt \u@database-one \R:\m:\s [\d] session1>

PROMPT set to '\u@database-one \R:\m:\s [\d] session1>'

root@database-one 13:57:55 [(none)] session1>use gftest;

Database changed

root@database-one 13:58:31 [gftest] session1>select * from emp;

+--------+------+---------+------------+--------+

| ename | age | sal | hiredate | deptno |

+--------+------+---------+------------+--------+

| 郭军 | 27 | 8400.00 | 2019-12-08 | 10 |

| 刘杰 | 30 | 9100.00 | 2018-04-09 | 10 |

| 王艳 | 24 | 6000.00 | 2020-01-05 | 20 |

| 马丽 | 26 | 7200.00 | 2018-07-06 | 30 |

| 肖伟 | 29 | 8700.00 | 2017-05-28 | 30 |

+--------+------+---------+------------+--------+

5 rows in set (0.00 sec)

root@database-one 14:03:18 [gftest] session1>lock tables emp read;

Query OK, 0 rows affected (0.00 sec)

root@database-one 14:03:20 [gftest] session1>insert into emp values('陈实',31,9000,'2019-07-01',10);

ERROR 1099 (HY000): Table 'emp' was locked with a READ lock and can't be updated

可以看到,read锁定时只能读取,无法修改数据。

会话2登入,并修改提示符包含session2字样,然后对emp表读取。

root@database-one 14:04: [(none)]> prompt \u@database-one \R:\m:\s [\d] session2>

PROMPT set to '\u@database-one \R:\m:\s [\d] session2>'

root@database-one 14:05:04 [(none)] session2>use gftest;

Database changed

root@database-one 14:05:10 [gftest] session2>select * from emp;

+--------+------+---------+------------+--------+

| ename | age | sal | hiredate | deptno |

+--------+------+---------+------------+--------+

| 郭军 | 27 | 8400.00 | 2019-12-08 | 10 |

| 刘杰 | 30 | 9100.00 | 2018-04-09 | 10 |

| 王艳 | 24 | 6000.00 | 2020-01-05 | 20 |

| 马丽 | 26 | 7200.00 | 2018-07-06 | 30 |

| 肖伟 | 29 | 8700.00 | 2017-05-28 | 30 |

+--------+------+---------+------------+--------+

5 rows in set (0.00 sec)

root@database-one 14:05:20 [gftest] session2>lock tables emp read;

Query OK, 0 rows affected (0.00 sec)

可以看到,继续能够读取,同时也能加read锁。

[LOW_PRIORITY] WRITE锁:

持有锁的会话可以读写表。

只有持有锁的会话才能访问表。在释放锁之前,其他会话无法访问它。

当保持WRITE锁时,其他会话对表的锁请求被阻塞。

LOW_PRIORITY关键字已经作废。在以前的MySQL版本中,它影响锁定行为,但现在已经不是这样了。现在不推荐使用它,它的使用会产生一个警告。

会话1登入,并修改提示符包含session1字样,然后对emp表写入,可以进行,然后用lock tables给emp表加write锁定。

root@database-one 21:32: [(none)]> prompt \u@database-one \R:\m:\s [\d] session1>

PROMPT set to '\u@database-one \R:\m:\s [\d] session1>'

root@database-one 21:32:57 [(none)] session1>use gftest;

Database changed

root@database-one 21:33:07 [gftest] session1>select * from emp;

+--------+------+---------+------------+--------+

| ename | age | sal | hiredate | deptno |

+--------+------+---------+------------+--------+

| 郭军 | 27 | 8400.00 | 2019-12-08 | 10 |

| 刘杰 | 30 | 9100.00 | 2018-04-09 | 10 |

| 王艳 | 24 | 6000.00 | 2020-01-05 | 20 |

| 马丽 | 26 | 7200.00 | 2018-07-06 | 30 |

| 肖伟 | 29 | 8700.00 | 2017-05-28 | 30 |

+--------+------+---------+------------+--------+

5 rows in set (0.00 sec)

root@database-one 21:33:20 [gftest] session1>insert into emp values('陈实',31,9000,'2019-07-01',10);

Query OK, 1 row affected (0.01 sec)

root@database-one 21:34:50 [gftest] session1>lock tables emp write;

Query OK, 0 rows affected (0.00 sec)

会话2登入,并修改提示符包含session2字样,然后对emp表进行查询。

root@database-one 21:38: [(none)]> prompt \u@database-one \R:\m:\s [\d] session2>

PROMPT set to '\u@database-one \R:\m:\s [\d] session2>'

root@database-one 21:38:13 [(none)] session2>use gftest;

Database changed

root@database-one 21:38:21 [gftest] session2>select * from emp;

可以看到,表被以write方式锁定后,其它会话读取都无法进行,更不用提写入了。

UNLOCK TABLES显式释放当前会话持有的任何表锁。我们去session1中释放锁。

root@database-one 21:36:20 [gftest] session1>

root@database-one 21:45:29 [gftest] session1>unlock tables;

Query OK, 0 rows affected (0.00 sec)

root@database-one 21:45:43 [gftest] session1>

root@database-one 21:38:21 [gftest] session2>select * from emp;

+--------+------+---------+------------+--------+

| ename | age | sal | hiredate | deptno |

+--------+------+---------+------------+--------+

| 郭军 | 27 | 8400.00 | 2019-12-08 | 10 |

| 刘杰 | 30 | 9100.00 | 2018-04-09 | 10 |

| 王艳 | 24 | 6000.00 | 2020-01-05 | 20 |

| 马丽 | 26 | 7200.00 | 2018-07-06 | 30 |

| 肖伟 | 29 | 8700.00 | 2017-05-28 | 30 |

| 陈实 | 31 | 9000.00 | 2019-07-01 | 10 |

+--------+------+---------+------------+--------+

6 rows in set (7 min 11.08 sec)

root@database-one 21:45:43 [gftest] session2>

可以看到,session1在21:45:29后释放了锁,session2在21:45:43前就立即读取出了emp表的数据,整整排队等待了7分多钟,这些时间都被计入了这个SELECT的执行时间。

如果语句通过表名锁定,则不能使用别名。

root@database-one 21:57:54 [gftest] session1>lock table emp read;

Query OK, 0 rows affected (0.01 sec)

root@database-one 21:58:02 [gftest] session1>select * from emp as e;

ERROR 1100 (HY000): Table 'e' was not locked with LOCK TABLES

root@database-one 21:58:06 [gftest] session1>select * from emp;

+--------+------+---------+------------+--------+

| ename | age | sal | hiredate | deptno |

+--------+------+---------+------------+--------+

| 郭军 | 27 | 8400.00 | 2019-12-08 | 10 |

| 刘杰 | 30 | 9100.00 | 2018-04-09 | 10 |

| 王艳 | 24 | 6000.00 | 2020-01-05 | 20 |

| 马丽 | 26 | 7200.00 | 2018-07-06 | 30 |

| 肖伟 | 29 | 8700.00 | 2017-05-28 | 30 |

| 陈实 | 31 | 9000.00 | 2019-07-01 | 10 |

+--------+------+---------+------------+--------+

6 rows in set (0.00 sec)

如果使用别名锁定,则必须在语句中使用别名引用该表:

root@database-one 22:00:54 [gftest] session1>unlock tables;

Query OK, 0 rows affected (0.00 sec)

root@database-one 22:01:23 [gftest] session1>

root@database-one 22:01:25 [gftest] session1>lock table emp as e read;

Query OK, 0 rows affected (0.00 sec)

root@database-one 22:01:30 [gftest] session1>select * from emp;

ERROR 1100 (HY000): Table 'emp' was not locked with LOCK TABLES

root@database-one 22:01:34 [gftest] session1>select * from emp as e;

+--------+------+---------+------------+--------+

| ename | age | sal | hiredate | deptno |

+--------+------+---------+------------+--------+

| 郭军 | 27 | 8400.00 | 2019-12-08 | 10 |

| 刘杰 | 30 | 9100.00 | 2018-04-09 | 10 |

| 王艳 | 24 | 6000.00 | 2020-01-05 | 20 |

| 马丽 | 26 | 7200.00 | 2018-07-06 | 30 |

| 肖伟 | 29 | 8700.00 | 2017-05-28 | 30 |

| 陈实 | 31 | 9000.00 | 2019-07-01 | 10 |

+--------+------+---------+------------+--------+

6 rows in set (0.00 sec)

会话可以显式释放其锁,或者在某些条件下隐式释放锁。

会话可以使用UNLOCK TABLES显式释放其锁。

如果会话已经持有锁,还发出LOCK TABLES语句来获取新锁,那么在授予新锁之前,现有锁将被隐式释放。

如果会话开始事务(例如,使用START transaction),则隐式执行UNLOCK TABLES,从而释放现有锁。

无论客户端会话的连接正常结束或异常终止,服务器均隐式释放该会话持有的所有表锁(事务性和非事务性)。

LOCK TABLES和UNLOCK TABLES与事务的交互如下:

LOCK TABLES不是事务安全的,在尝试锁定表之前隐式提交任何活动事务。

UNLOCK TABLES隐式提交任何活动事务,前提是LOCK TABLES已用于获取表锁。例如,在以下语句集中,UNLOCK TABLES释放全局读取锁,但不提交事务,因为没有有效的表锁:

FLUSH TABLES WITH READ LOCK;

START TRANSACTION;

SELECT ... ;

UNLOCK TABLES;

开始事务(例如,使用START transaction)隐式提交任何当前事务并释放现有表锁。

对事务表(如InnoDB TABLES)使用LOCK TABLES和UNLOCK TABLES的正确方法是,以SET autocommit=0(不是START transaction)后跟LOCK TABLES开始事务,并且在显式提交事务之前不调用UNLOCK TABLES。例如,如果需要写入表t1并读取表t2,可以执行以下操作:

SET autocommit=0;

LOCK TABLES t1 WRITE, t2 READ, ...;

... do something with tables t1 and t2 here ...

COMMIT;

UNLOCK TABLES;

ROLLBACK不会释放表锁。

综上所述,当我们需要独占式的对表做一些运维操作时,使用LOCK TABLES和UNLOCK TABLES是个很不错的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 西南科技大学 货币银行学 在线考试复习资料(1)

货币银行学——在线考试复习资料 一、单选题 1.最严重的恶性通货膨胀的最终结果是( )。 A.突发性的商品抢购 B.挤兑银行 C.货币制度崩溃 D.投机盛行 2.凯恩斯的货币需求函数非常重视( )。 A.恒久收入的作用 B.货币供应量的作用 C.利率的作用 D.汇率的作用 3.下列西方的中央银…

【渝粤教育】电大中专学前儿童健康教育 (4)作业 题库

作业视频教务托管,壹叁路路贰陆陆壹〇肆〇 健康的定义是( )年,世界卫生组织提出的。 A.1948 B.1958 C.1955 D.1945 正确 正确答案:左边查询 学生答案:A 2.健康不仅仅是没有疾病或虚弱,而是包括身体、心理和( )方面的完…

mysql autoenlist默认_mysql连接参数详解

通常数据库连接字符串为:Databasedbname;Data Source192.168.1.1;Port3306;User Idroot;Password****;Charsetutf8;TreatTinyAsBooleanfalse;其中: Server,host, data source, datasource, address, addr, network address: 数据库位置(以上任…

【渝粤教育】电大中专工程图学基础 (3)作业 题库

1基础结构施工图主要是表示建筑物在相对标高正负0.000以下基础结构的图样。 A正确 B错误 正确 正确答案:左边查询 学生答案:A 2建筑工程图是表达建筑工程设计的重要技术资料,是施工的依据。 A正确 B错误 正确 正确答案:左边查询 学…

简而言之SPIFFE

我一直在研究SPIFEE(每个人的安全生产身份框架)[1],在这里,我正在按照我现在的理解起草流程,以使任何试图理解流程的人受益。 身份注册表 – SPIRE服务器具有自己的身份注册表,该注册表保留两个粗粒度属性…

【渝粤教育】电大中专建筑材料 (3)作业 题库

1颗粒材料的密度为ρ,表观密度为ρ0,堆积密度为ρ0′,则存在下列关系()。 Aρ>ρ0′>ρ0 Bρ>ρ0>ρ0′ Cρ0>ρ>ρ0′ Dρ0′>ρ&…

c++ 多个字符串排序_Python小白干货宝典:sorted()函数:列表元素排序

定义:sorted() 函数对所有可迭代的对象进行排序操作。内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。语法:sorted 语法:sorted(iterable, cmpNone, keyNone, reverseFalse)返回值:返回重…

【渝粤教育】电大中专液压与气动技术_1作业 题库

1.液压泵吸油口的真空度由三部分组成:①把油液提升到一定高度所需的压力。产生一定的流速所需的压力。吸油管内压力损失。该说法() A.正确 B.错误 正确 正确答案:左边查询 学生答案:A 2.在液压系统的管路中&#xff0c…

工业级以太网交换机的使用情况分析

工业级以太网交换机是专门为满足灵活多变的工业应用需求而设计,提供一种高性价比工业以太网通讯解决方案。工业以太网交换机,作为我们广为使用的局域网硬件设备,一直为大家所熟悉。它的普及程度其实是由于以太网的广泛使用,作为今…

【渝粤教育】电大中专电子商务网站建设与维护 (16)作业 题库

1.阿里巴巴信息服务栏目主要包括以下内容:商业机会、产品展示、公司全库、行业资讯、价格行情、以商会友、商业服务。 ( ) A.错误 B.正确 错误 正确答案:左边查询 学生答案:未作答 2.阿里巴巴的运营模式,概…

工业级以太网交换机产品特征及应用案例介绍

工业以太网交换机(简称工业交换机)是专门为满足灵活多变的工业应用需求而提供的一种高性价比的组网设备。针对工业控制的实际需求,工业交换机解决了通信实时性、网络可用性能和安全性等技术问题。与普通商业交换机相比,工业交换机…

【渝粤教育】电大中专药事管理与法规_1作业 题库

1.根据《执业药师职业资格制度规定》,执业药师职业资格考试中提出考试合格标准建议的部门是()。 A.国家药品监督管理局 B.国家人力资源社会保障部 C.国家卫生健康委员会 D.国家医疗保障局 正确 正确答案:左边查询 学生答案&#x…

mysql 热块_MySQL分布式集群之MyCAT(三)rule的分析【转】

首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改---------------------------------------------------------------------------------这才是本体~----------…

glassfish发布应用_WildFly 8与GlassFish 4 –选择哪个应用服务器

glassfish发布应用自从我上一个博客以来已经有一段时间了。 我显然忙于其他事情,包括我的主要工作。 在对应用服务器的正确选择提出更多疑问之后,是时候再次讨论这个话题并分享我的想法。 该博客上最常阅读的文章之一是有关选择哪种Java EE 6应用程序服…

【渝粤教育】电大中专计算机职业素养 (5)作业 题库

1.曾经的一项调查发现一些企业业绩不好,客户流失的最重要的原因是( )。 A.企业管理问题 B.企业员工素养达不到要求 C.企业产品价格不好 D.企业产品质量问题 错误 正确答案:左边查询 学生答案:A 2.( &#x…

【渝粤教育】电大中专跨境电子商务理论与实务答案作业 题库

1.在按照服务类型中,( )服务平台主要是为境内外会员商户提供网络营销平台,传递供应商或采购商等商家的商品或服务信息,促成双方完成交易。 A.信息服务平台 B.在线交易平台 C.线上服务平台 D.线下交易平台 正确 正确答案…

工业交换机的四种安装方式图解

工业交换机的作用可以说是非常强大的,其应用十分广泛,在电力、轨道交通、市政、煤矿安全、工厂自动化、水处理系统、城市安防等都有它的身影,为现代生活智能化的发展提供了非常大的助力。但是由于使用环境的原因,在安装工业交换机…

hutool 获取某月最后一天_hutool定时任务

CronUtil通过一个全局的定时任务配置文件,实现统一的定时任务调度。1.1 pom文件cn.hutoolhutool-all4.1.01.2对于Maven项目,首先在src/main/resources/下创建config包,在包中放入cron.setting文件(默认是这个路径的这个文件),然后…

亚马逊Corretto 8

更新! 我已将在Docker中运行Corretto的选项更新为使用Docker Hub中可用的amazoncorretto Docker映像。 Amazon Corretto是OpenJDK的生产就绪发行版,具有长期支持,包括Amazon提供的性能和安全更新。 Amazon提供了适用于Linux,Win…

【渝粤题库】陕西师范大学400013 组织行为学 作业(专升本)

《组织行为学》作业 一、名词解释 1、组织行为学 2、组织文化 3、激励 4、需要 5、沟通 6、过程 7、 动机 8、社会知觉 9、角色 10、凝聚力 二、判断正误,并简述理由 1、管理思想史上对人的因素的重视自泰罗始。 2、社会人理论假设认为,人的行为是为了获…