• 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. opencv源码:cascadedetect

    级联分类器检测类CascadeClassifier,提供了两个重要的方法: CascadeClassifier cascade_classifier; cascade_classifier.load( ...

  2. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  3. web前端基础知识

    #HTML    什么是HTML,和他ML...    网页可以比作一个装修好了的,可以娶媳妇的房子.    房子分为:毛坯房,精装修    毛坯房的修建: 砖,瓦,水泥,石头,石子....    精 ...

  4. C#中5步完成word文档打印的方法

    在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选 ...

  5. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  6. 【Big Data】HADOOP集群的配置(一)

    Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...

  7. PHP类和对象之重载

    PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...

  8. C#~异步编程再续~await与async引起的w3wp.exe崩溃-问题友好的解决

    返回目录 关于死锁的原因 理解该死锁的原因在于理解await 处理contexts的方式,默认的,当一个未完成的Task 被await的时候,当前的上下文将在该Task完成的时候重新获得并继续执行剩余 ...

  9. DockerCon 2016 – 微软带来了什么?

    根据Forrester的调查,接近半数的企业CIO在考虑IT架构的时候更乐于接受开源方案,这主要是基于低成本,避免供应商锁定和敏捷的需求:同时另外一家North Bridge的调研机构的调查显示,20 ...

  10. web.xml中load-on-startup的作用

    如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <ser ...