下面是对事务表使用LOCK TABLES的说明:在尝试锁定表之前,LOCK TABLES不是事务安全型的,会隐含地提交所有活性事务。同时,开始一项事务(例如,使用START TRANSACTION),会隐含地执行UNLOCK TABLES对事务表(如InnoDB)使用LOCK TABLES的正确方法是,设置AUTOCOMMIT=0并且不能调用UNLOCK TABLES,直到您明确地提交事务为止。当您调用LOCK TABLES时,InnoDB会内部地取其自己的表锁定,MySQL取其自己的表锁定。InnoDB在下一个提交时释放其表锁定,但是,对于MySQL,要释放表锁定,您必须调用UNLOCK TABLES。您不应该让AUTOCOMMIT=1,因为那样的话,InnoDB会在调用LOCK TABLES之后立刻释放表锁定,并且很容易形成死锁定。注意,如果AUTOCOMMIT=1,我们根本不能获取InnoDB表锁定,这样就可以帮助旧的应用软件避免不必要的死锁定。ROLLBACK不会释放MySQL的非事务表锁定。要使用LOCK TABLES,您必须拥有相关表的LOCK TABLES权限和SELECT权限。使用LOCK TABLES的主要原因是仿效事务,或在更新表时加快速度。这将在后面进行更详细的解释。如果一个线程获得对一个表地READ锁定,该线程(和所有其它线程)只能从该表中读取。如果一个线程获得对一个表的WRITE锁定,只有保持锁定的线程可以对表进行写入。其它的线程被阻止,直到锁定被释放时为止。READ LOCAL和READ之间的区别是,READ LOCAL允许在锁定被保持时,执行非冲突性INSERT语句(同时插入)。但是,如果您正打算在MySQL外面操作数据库文件,同时您保持锁定,则不能使用READ LOCAL。对于InnoDB表,READ LOCAL与READ相同。当您使用LOCK TABLES时,您必须锁定您打算在查询中使用的所有的表。虽然使用LOCK TABLES语句获得的锁定仍然有效,但是您不能访问没有被此语句锁定的任何的表。同时,您不能在一次查询中多次使用一个已锁定的表——使用别名代替,在此情况下,您必须分别获得对每个别名的锁定。mysql> LOCK TABLE t WRITE, t AS t1 WRITE;mysql> INSERT INTO t SELECT * FROM t;ERROR 1100: Table 't' was not locked with LOCK TABLESmysql> INSERT INTO t SELECT * FROM t AS t1;如果您的查询使用一个别名引用一个表,那么您必须使用同样的别名锁定该表。如果没有指定别名,则不会锁定该表。mysql> LOCK TABLE t READ;mysql> SELECT * FROM t AS myalias;ERROR 1100: Table 'myalias' was not locked with LOCK TABLES相反的,如果您使用一个别名锁定一个表,您必须使用该别名在您的查询中引用该表。mysql> LOCK TABLE t AS myalias READ;mysql> SELECT * FROM t;ERROR 1100: Table 't' was not locked with LOCK TABLESmysql> SELECT * FROM t AS myalias;WRITE锁定通常比READ锁定拥有更高的优先权,以确保更新被尽快地处理。这意味着,如果一个线程获得了一个READ锁定,则另一个线程会申请一个WRITE锁定,后续的READ锁定申请会等待,直到WRITE线程获得锁定并释放锁定。您可以使用LOW_PRIORITY WRITE锁定来允许其它线程在该线程正在等待WRITE锁定时获得READ锁定。只有当您确定最终将有一个时机,此时没有线程拥有READ锁定时,您才应该使用LOW_PRIORITY WRITE锁定。LOCK TABLES按照如下方式执行:1.    按照内部定义的顺序,对所有要被锁定的表进行分类。从用户的角度,此顺序是未经定义的。2.    如果使用一个读取和一个写入锁定对一个表进行锁定,则把写入锁定放在读取锁定之前。3.    一次锁定一个表,直到线程得到所有锁定为止。该规则确保表锁定不会出现死锁定。但是,对于该规则,您需要注意其它的事情:如果您正在对一个表使用一个LOW_PRIORITY WRITE锁定,这只意味着,MySQL等待特定的锁定,直到没有申请READ锁定的线程时为止。当线程已经获得WRITE锁定,并正在等待得到锁定表清单中的用于下一个表的锁定时,所有其它线程会等待WRITE锁定被释放。如果这成为对于应用程序的严重的问题,则您应该考虑把部分表转化为事务安全型表。您可以安全地使用KILL来结束一个正在等待表锁定的线程。注意,您不能使用INSERT DELAYED锁定任何您正在使用的表,因为,在这种情况下,INSERT由另一个线程执行。通常,您不需要锁定表,因为所有的单个UPDATE语句都是原子性的;没有其它的线程可以干扰任何其它当前正在执行的SQL语句。但是,在几种情况下,锁定表会有好处:如果您正在对一组MyISAM表运行许多操作,锁定您正在使用的表,可以快很多。锁定MyISAM表可以加快插入、更新或删除的速度。不利方面是,没有线程可以更新一个用READ锁定的表(包括保持锁定的表),也没有线程可以访问用WRITE锁定的表(除了保持锁定的表以外)。有些MyISAM操作在LOCK TABLES之下更快的原因是,MySQL不会清空用于已锁定表的关键缓存,直到UNLOCK TABLE被调用为止。通常,关键缓存在每个SQL语句之后被清空。如果您正在使用MySQL中的一个不支持事务的存储引擎,则如果您想要确定在SELECT和UPDATE之间没有其它线程,您必须使用LOCK TABLES。本处所示的例子要求LOCK TABLES,以便安全地执行:mysql> LOCK TABLES trans READ, customer WRITE;·                mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;·                mysql> UPDATE customer·                    ->     SET total_value=sum_from_previous_statement·                    ->     WHERE customer_id=some_id;·                mysql> UNLOCK TABLES;如果没有LOCK TABLES,有可能另一个线程会在执行SELECT和UPDATE语句之间在trans表中插入一个新行。通过使用相对更新(UPDATE customer SET value=value+new_value)或LAST_INSERT_ID()函数,您可以在许多情况下避免使用LOCK TABLES。通过使用用户层级的顾问式锁定函数GET_LOCK()和RELEASE_LOCK(),您也可以在有些情况下避免锁定表。这些锁定被保存在服务器中的一个混编表中,使用pthread_mutex_lock() 和pthread_mutex_unlock(),以加快速度。要了解更多有关锁定规则的说明您可以使用FLUSH TABLES WITH READ LOCK语句锁定位于所有带有读取锁定的数据库中的所有表。如果您有一个可以及时拍摄快照的文件系统,比如Veritas,这是获得备份的一个非常方便的方式。注释:如果您对一个已锁定的表使用ALTER TABLE,该表可能会解锁。

mysql数据库备份提示1577_mysqldump备份数据库时出现when using LOCK TABLES的提示相关推荐

  1. mysqldump备份数据库时出现when using LOCK TABLES

    用mysqldump备份数据库时,如果出现when using LOCK TABLES,解决办法是加上 --skip-lock-tables 例如: 用mysqldump备份数据库时出现 29: Fi ...

  2. mysql 1100_错误代码:1100 Table 't_depart_info' was not locked with LOCK TABLES的解决方法

    一步步来分析错误代码的生成原因,大家要有耐心哦. 第一步,错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:insert into ...

  3. 如何查看mysql备份的情况_MySQL数据库备份详解(示例代码)

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  4. 使用xtrabackup远程备份到及重建数据库

    准备工作: 从percona网站下载xtrabackup: wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2 ...

  5. lock mysql unlock_MySQL中的lock tables和unlock tables

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

  6. mysql还原数据库后日期显示3000_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...

    补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题. 背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机 ...

  7. mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法

    mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法 参考文章: (1)mysql 直接从date 文件夹备份表,还原数据库之后提示 t ...

  8. mysql 备份文件太大_mysql数据库太大了怎么备份

    本地: 1.进入MySQL目录下的bin文件夹:e:回车:e:\>cd mysql\bin 回车2.导出数据库:mysqldump -u?用户名 -p 数据库名 > 导出的文件名范例:my ...

  9. mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)

    MySQL数据库重命名的方法 Innodb引擎的表如何改数据库名,MyISAM引擎又该如何操作. 如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以. Innodb完全不行,会提示相 ...

最新文章

  1. Redis 分布式锁没这么简单,网上大多数都有 bug
  2. c语言字符串文库总结,C语言字符串.ppt
  3. centos7 服务器上的tomcat快速安装
  4. python时间序列异常值查找_(No.38)时间序列异常点检测算法
  5. Python2 包的安装
  6. 波卡生态DAO基础设施完成150万美元战略融资
  7. FLAT:又快又好的中文命名实体识别模型
  8. 二进制转8421bcd码_绝对值编码器当中的格雷码
  9. Avalondock 第三步 创建停靠面板组
  10. python输出姓名_如何用Python生成若干个随机姓名?男女取名有方法,不能千篇一律...
  11. Linux,IP归属地查询(nali)
  12. 腾讯视频获取 MP4格式源并下载
  13. linux下编译ts工程,linux下搭建生成HLS所需的.ts和.m3u8文件
  14. MI5s安装LineageOS 16
  15. 性价比高的口粮酒推荐,聪明人都选这3款,口感醇厚,纯粮好喝
  16. Spring——Security安全框架之记住我
  17. lisp实战文库_lisp编程实例
  18. java 游戏管理系统_从零开始实现放置游戏(三):后台管理系统搭建
  19. Linux系统基本知识(4)
  20. 老品牌万能阅读器,Calibre中文版(阅读转换)

热门文章

  1. java处理最后一周_Java获取某年某周的最后一天
  2. excel 宏编程_在 Excel 中使用 Python 开发宏脚本
  3. 华为c语言编程规范_单片机开发之C语言编程基本规范
  4. VSCode生成.vue模版
  5. android10位置信息,Android 11 中的位置信息更新
  6. python内置函数源代码_4.内置函数源码总结
  7. mybatis框架中的mapper.xml文件中的头部代码
  8. C/C++控制台应用程序——画三角形、圆、直线、矩形
  9. mysql常用备份指令
  10. Spring 如何解决循环依赖?