MYSQL调度与锁定问题:

4.5 调度与锁定问题

前面各段主要将精力集中在使个别的查询更快上。MySQL还允许影响语句的调度特性,这样会使来自几个客户机的查询更好地协作,从而单个客户机不会被锁定太长的时间。更改调度特性还能保证特定的查询处理得更快。我们先来看一下MySQL的缺省调度策略,然后

来看看为改变这个策略可使用什么样的选项。出于讨论的目的,假设执行检索( SELECT)的客户机程序为读取程序。执行修改表操作( DELETE,INSERT,REPLACE 或UP DATE)的另一个客户机程序为写入程序。

MySQL的基本调度策略可总结如下:

■ 写入请求应按其到达的次序进行处理。

■ 写入具有比读取更高的优先权。

在表锁的帮助下实现调度策略。客户机程序无论何时要访问表,都必须首先获得该表的锁。可以直接用LOCK TABLES 来完成这项工作,但一般服务器的锁管理器会在需要时自动获得锁。在客户机结束对表的处理时,可释放表上的锁。直接获得的锁可用UNLOCK TABLES 释放,但服务器也会自动释放它所获得的锁。

执行写操作的客户机必须对表具有独占访问的锁。在写操作进行中,由于正在对表进行数据记录的删除、增加或更改,所以该表处于不一致状态,而且该表上的索引也可能需要作相应的更新。如果表处于不断变化中,此时允许其他客户机访问该表会出问题。让两个客户

机同时写同一个表显然不好,因为这样会很快使该表不可用。允许客户机读不断变化的表也不是件好事,因为可能在读该表的那一刻正好正在对它进行更改,其结果是不正确的。执行读取操作的客户机必须有一把防止其他客户机写该表的锁,以保证读表的过程中表不出现变化。不过,该锁无需对读取操作提供独占访问。此锁还允许其他客户机同时对表进行读取。读取不会更改表,所有没必要阻止其它客户机对该表进行读取。

MySQL允许借助几个查询限修饰符对其调度策略施加影响。其中之一是DELETE、INSERT、LOAD DATA、REPLACE 和UP DATE 语句的LOW_PRIORITY 关键字。另一个是SELECT 语句的HIGH_PRIORITY 关键字。第三个是INSERT 和REPLACE 语句的DELAYED 关键字。

LOW_PRIORITY 关键字按如下影响调度。一般情况下,如果某个表的写入操作在表正被读取时到达,写入程序被阻塞,直到读取程序完成,因为一旦某个查询开始,就不能中断。如果另一读取请求在写入程序等待时到达,此读取程序也被阻塞,因为缺省的调度策略为写

入程序具有比读取程序高的优先级。在第一个读取程序结束时,写入程序继续,在此写入程序结束时,第二个读取程序开始。

如果写入请求为LOW_PRIORITY 的请求,则不将该写入操作视为具有比读取操作优先级高的操作。在此情形下,如果第二个读取请求在写入程序等待时到达,则让第二个读取操作排在等待的写入操作之前。仅当没有其他读取请求时,才允许写入程序执行。这种调度的

更改从理论上说,其含义为LOW_PRIORITY 写入可能会永远被阻塞。当正在处理前面的读取请求时,只要另一个读取请求到达,这个新的请求允许排在LOW_PRIORITY 写入之前。

SELECT 查询的HIGH_PRIORITY 关键字作用类似。它使SELECT 插在正在等待的写入操作之前,即使该写入操作具有正常的优先级。INSERT 的DELAYED 修饰符作用如下,在表的一个INSERT DELAYED 请求到达时,服务器将相应的行放入一个队列,并立即返回一个状态到客户机程序,以便该客户机程序可以继续执行,即使这些行尚未插入表中。如果读取程序正在对表进行读取,那么队列中的行

挂起。在没有读取时,服务器开始开始插入延迟行队列中的行。服务器不时地停下来看看是否有新的读取请求到达,并进行等待。如果是这样,延迟行队列将挂起,并允许读取程序继续。在没有其他的读取操作时,服务器再次开始插入延迟行。这个过程一直进行到延迟行队

列空为止。

此调度修饰符并非出现在所有MySQL版本中。下面的表列出了这些修饰符和支持这些修饰符的MySQL版本。可利用此表来判断所使用的MySQL版本具有什么样的功能:

INSERT DELAYED 在客户机方的作用

如果其他客户机可能执行冗长的SELECT 语句,而且您不希望等待插入完成,此时INSERT DELAYED 很有用。发布INSERT DELAYED 的客户机可以更快地继续执行,因为服务器只是简单地将要插入的行插入。不过应该对正常的INSERT 和INSERT DELAYED 性能之间的差异有所认识。如果INSERT DELAYED 存在语法错误,则向客户机发出一个错误,如果正常,便不发出信息。例如,在此语句返回时,不能相信所取得的AUTO_INCREMENT 值。也得不到惟一索引上的重复数目的计数。之所以这样是因为此插入操作在实际的插入完成前返回了一个状

态。其他还表示,如果INSERT DELAYED 语句的行在等待插入中被排队,并且服务器崩溃或被终止(用kill -9),那么这些行将丢失。正常的TERM 终止不会这样,服务器会在退出前将这些行插入。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-122769/,如需转载,请注明出处,否则将追究法律责任。

mysql更改锁机别_MYSQL调度与锁定问题(转)相关推荐

  1. mysql数据锁的类型_MySQL数据库锁类型

    锁概念: 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 一个栗子 :以买火车票为例,火车票可面向广大消费 ...

  2. mysql行锁表怎么办_mysql - 表锁,行锁

    MyISAM存储引擎:开销小,加锁快,无死锁.锁定粒度大,并发度低,容易发生锁冲突.   不支持事务.            采用表锁 (操作时对操作的表上锁) 基本不用了 innoDB存储引擎:开销 ...

  3. mysql 查看锁表日志_MYSQL 表锁情况查看

    查看锁表情况 mysql> show status like 'Table%'; +----------+--–+ | Variable_name | Value | +----------+- ...

  4. mysql 表锁的概念_MySQL 锁的一些简单概念

    1. 锁的粒度 在MySQL中,只要有多个请求需要在同一时刻修改数据,都会产生并发控制的问题.而锁的作用可以保证同一资源能被某个请求唯一使用. 加锁是会消耗系统资源的,包括获得锁.检查锁是否已解除.释 ...

  5. MySQL中锁的必要性_MySQL中的锁之一:锁的必要性及分类

    当用户访问量增长时,数据库往往是一个系统的性能瓶颈,但不光光是性能瓶颈,数据安全也会随之浮现,这时候锁机制就非常有必要. 并发造成的数据安全问题主要分为3个方面:脏读.幻读.不可重复读 一. 脏读 脏 ...

  6. mysql悲观锁的应用_mysql悲观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个很是基础的概念.mysql 悲观锁(Pessimistic Lock) 悲观锁的特色是先获取锁,再进行业务操做,即"悲观&qu ...

  7. mysql行锁索引问题_Mysql锁机制--索引失效导致行锁变表锁

    =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不会产生相互影响.不会阻塞, ...

  8. mysql 不锁表备份_Mysql不锁表备份之Xtrabackup的备份与恢复

    一.Xtrabackup介绍 MySQL冷备.热备.mysqldump都无法实现对数据库进行增量备份.如果数据量较大我们每天进行完整备份不仅耗时且影响性能.而Percona-Xtrabackup就是为 ...

  9. mysql 主从宕机切换_mysql主从复制配置操作以及主从宕机切换演练

    主从复制目的: 主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器.在主从服务器上分开处理用户的请求,读的话,可以直接读取备机数据,可获得更短的响应时 ...

最新文章

  1. 使tomcat和lighttpd使用service启停
  2. python for循环九九乘法表_python—用for循环、while循环和一句话打印九九乘法表
  3. 监控Spark应用方法简介
  4. 【职场】看一位前端工程师如何上班摸鱼
  5. git 怎么提交忽略文件夹_git 设置忽略文件提交的几种方式
  6. 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup...
  7. 容量耦合系数模型_期刊在线 | 基于ALE流固耦合方法的刷式密封泄漏特性理论与实验研究...
  8. hibernate整合mysql配置文件_springboot整合hibernate配置
  9. java非法字符检测_Java Web 一些特殊字符的过滤(appscan检查的安全问题)
  10. ADC采样间隔问题+TRGO作为ADC的触发源头
  11. 元素(Element)
  12. python实现高级计算器_Python实现的复杂的计算器的代码
  13. 回复和评论功能的实现
  14. 【java】java实现pdf根据内容定位插入图片
  15. mysql查询时间监控_监控长时间运行的查询(监控数据库性能的SQL )
  16. Python 发出警报声音 简单播放声音 beep 在linux 上
  17. Travelling not wandering
  18. QLabel控件实现圆形头像显示
  19. 自学Linux命令10
  20. GoogleAdMob广告 SDK接入(Android)

热门文章

  1. R语言Gamma分布函数Gamma Distribution(dgamma, pgamma, qgamma rgamma)实战
  2. plotly基于dataframe数据绘制散点图(scatter plot)
  3. python使用argparse解析命令行参数
  4. 极大似然估计(Maximum Likelihood Estimattion Theory)是什么?极大似然估计的本质思想是什么?为什么极大似然可以作为损失函数使用?负对数似然损失函数(Negative
  5. PACBIO:经历9件大事,终获一致认可?
  6. 查看服务器CPU的个数、CPU的核数、多核超线程数
  7. mysql顺序结构_MySQL学习之流程结构
  8. html如何让列表呈直线排列,html – 列表分成多列
  9. vue element ui 滚动条
  10. 【MySQL】(图解)快速理解内连接、外连接、左连接、右连接