• 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的交互的更多相关文章

  1. MySQL中lock tables和unlock tables浅析

    MySQL中lock tables和unlock tables浅析   在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Se ...

  2. 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 ...

  3. LOCK TABLES 和 UNLOCK TABLES

    MySQLdump的时LOCK TABLES 和 UNLOCK TABLES 在mysqldump后的数据中会发现有 LOCK TABLES tables_name WRITE;和结尾处有 UNLOC ...

  4. MySQL的lock tables和unlock tables的用法(转载)

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  5. lock tables和unlock tables

    1.lock tables table1 read,table2 read,table3 read igoodful@a8-apple-iphone-db00.wh(glc) > show ta ...

  6. 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 ...

  7. MySQL LOCK TABLES 与UNLOCK TABLES

    http://blog.csdn.net/zyz511919766/article/details/16342003 1语法 LOCK TABLES tbl_name[[AS] alias] lock ...

  8. mysql中lock tables与unlock tables(锁表/解锁)使用总结

    php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(t ...

  9. 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析

    关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...

随机推荐

  1. 用dubbo时遇到的一个序列化的坑

    首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...

  2. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. C# 注册 Windows 热键

    闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...

  5. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  6. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  7. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  8. HTTP常用状态码分析

    不管是面试还是工作中,经常会碰到需要通过HTTP状态码去判断问题的情况,比如对于后台RD,给到前端FE的一个接口,出现502或者504 error错误,FE就会说接口存在问题,如果没有知识储备,那就只 ...

  9. scp报错 -bash: scp: command not found

    环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...

  10. Android之Dedug--Circular dependencies cannot exist in AnimatorSet

    今日,在学习AnimatorSet时,使用play.with.after.before时,代码书写如下: ObjectAnimator animator1 = ObjectAnimator.ofFlo ...