LOCK TABLES和UNLOCK TABLES与Transactions的交互
- LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务。
- UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务。对于下面的一组语句,UNLOCK TABLES释放了全局读锁,但是因为没有表锁,不会提交事务。
FLUSH TABLES WITH READ LOCK;
START TRANSACTION;
SELECT ... ;
UNLOCK TABLES;
- 开始一个事务(例如,START TRANSACTION)隐式地提交任何当前事务,会释放现有的表锁。
- FLUSH TABLES WITH READ LOCK获取全局的读锁而不是表锁,所以他不会有像LOCK TABLES和UNLOCK TABLES对表锁和隐式提交一样的行为。例如,START TRANSACTION不会释放全局的读锁。
- ROLLBACK不会释放表锁。
- 正确的使用LOCK TABLES和UNLOCK TABLES与Transactions,例如对于InnoDB表,使用事务前设置SET autocommit = 0,LOCK TABLES前不加START TRANSACTION,直到提交事务以后再执行UNLOCK TABLES。例如,你想写入表t1,和读取表t2,可以这样做:
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with TABLES t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
当你调用LOCK TABLES时,InnoDB会获取内部表锁,然后MySql会获取表锁。InnoDB会在调用commit时释放内部表锁,但是如果MySql想要释放表锁,必须调用UNLOCK TABLES(第二条),且拥有内部表锁。所以必须设置SET autocommit = 0,因为InnoDB默认autocommit = 1,执行LOCK TABLES时,马上就会commit,并释放内部表锁。这样就极易导致死锁发生。
其实,即便是设置了autocommit = 1,LOCK TABLES和事务还是不友好。例如,第二个LOCK TABLES会将前面的事务提交:
SET autocommit=0;
LOCK TABLES foo WRITE;
INSERT INTO foo (foo_name) VALUES ('John');
LOCK TABLES bar WRITE; -- Implicit commit
ROLLBACK; -- No effect: data already committed
在很多情况下,InnoDB下SELECE...FOR UPDATE已经取代了LOCK TABLES,例如:
START TRANSACTION;
SELECT COUNT(*) FROM foo FOR UPDATE; -- Lock issued
INSERT INTO foo (foo_name) VALUES ('John');
SELECT COUNT(*) FROM bar FOR UPDATE; -- Lock issued, no side effects(没有影响)
ROLLBACK; -- Rollback works as expected(预期执行)
LOCK TABLES和UNL语句OCK TABLES是在服务器层实现的,和存储引擎无关。他们有自己的用途,但不能代替事务处理,如果需要用到事务,还是应该选择事务型存储引擎。一般情况下,如果使用的InnoDB存储引擎,没有必要使用LOCK TABLES语句。会严重影响性能,InnoDB的行级锁工作得更好。
参考
http://dev.mysql.com/doc/refman/5.6/en/lock-TABLES-and-transactions.html
转载请注明出处。
作者:wuxiwei
出处:http://www.cnblogs.com/wxw16/p/6143175.html
LOCK TABLES和UNLOCK TABLES与Transactions的交互的更多相关文章
- MySQL中lock tables和unlock tables浅析
MySQL中lock tables和unlock tables浅析 在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Se ...
- 14.3.5 LOCK TABLES and UNLOCK TABLES Syntax
14.3.5 LOCK TABLES and UNLOCK TABLES Syntax LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name ...
- LOCK TABLES 和 UNLOCK TABLES
MySQLdump的时LOCK TABLES 和 UNLOCK TABLES 在mysqldump后的数据中会发现有 LOCK TABLES tables_name WRITE;和结尾处有 UNLOC ...
- MySQL的lock tables和unlock tables的用法(转载)
早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...
- lock tables和unlock tables
1.lock tables table1 read,table2 read,table3 read igoodful@a8-apple-iphone-db00.wh(glc) > show ta ...
- mysql中lock tables与unlock tables
官网:https://dev.mysql.com/doc/refman/5.0/en/lock-tables.html LOCK TABLES tbl_name [[AS] alias] lock_t ...
- MySQL LOCK TABLES 与UNLOCK TABLES
http://blog.csdn.net/zyz511919766/article/details/16342003 1语法 LOCK TABLES tbl_name[[AS] alias] lock ...
- mysql中lock tables与unlock tables(锁表/解锁)使用总结
php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(t ...
- 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析
关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...
随机推荐
- 用dubbo时遇到的一个序列化的坑
首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...
- 启动了VSAN服务的主机不在vCenter集群中
背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- C# 注册 Windows 热键
闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- .NET面试题系列[8] - 泛型
“可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...
- HTTP常用状态码分析
不管是面试还是工作中,经常会碰到需要通过HTTP状态码去判断问题的情况,比如对于后台RD,给到前端FE的一个接口,出现502或者504 error错误,FE就会说接口存在问题,如果没有知识储备,那就只 ...
- scp报错 -bash: scp: command not found
环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...
- Android之Dedug--Circular dependencies cannot exist in AnimatorSet
今日,在学习AnimatorSet时,使用play.with.after.before时,代码书写如下: ObjectAnimator animator1 = ObjectAnimator.ofFlo ...