11. mysql锁机制_深入探讨MySQL锁机制

MySQL锁机制究竟是怎样的呢?这是很多人都提到过的问题,下面就为您详细介绍MySQL锁机制方面的知识,希望可以让您MySQL锁机制有更多的了解。

当前MySQL已经支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁了,BDB 表支持页级锁,InnoDB 表支持行级锁。

很多时候,可以通过经验来猜测什么样的锁对应用程序更合适,不过通常很难说一个锁比别的更好,这全都要依据应用程序来决定,不同的地方可能需要不同的锁。

想要决定是否需要采用一个支持行级锁的存储引擎,就要看看应用程序都要做什么,其中的查询、更新语句是怎么用的。例如,很多的web应用程序大量的做查询,很少删除,主要是基于索引的更新,只往特定的表中插入记录。采用基本的MySQL MyISAM 表就很合适了。

MySQL中对表级锁的存储引擎来说是释放死锁的。避免死锁可以这样做到:在任何查询之前先请求锁,并且按照请求的顺序锁表。

MySQL中用于 WRITE(写)的表锁的实现机制如下:

如果表没有加锁,那么就加一个写锁。

否则的话,将请求放到写锁队列中。

MySQL中用于 READ(读)的表锁的实现机制如下:

如果表没有加写锁,那么就加一个读锁。

否则的话,将请求放到读锁队列中。

当锁释放后,写锁队列中的线程可以用这个锁资源,然后才轮到读锁队列中的线程。

这就是说,如果表里有很多更新操作的话,那么 Select 必须等到所有的更新都完成了之后才能开始。

从 MySQL 3.23.33 开始,可以通过状态变量 Table_locks_waited 和 Table_locks_immediate 来分析系统中的锁表争夺情况:

mysql> SHOW STATUS LIKE 'Table%';

+-----------------------+---------+

| Variable_name         | Value   |

+-----------------------+---------+

|Table_locks_immediate | 1151552 |

| Table_locks_waited    | 15324   |

+-----------------------+---------+

在 MySQL 3.23.7(在Windows上是3.23.25)以后,在 MyISAM 表中只要没有冲突的 Insert 操作,就可以无需使用锁表自由地并行执行 Insert 和 Select 语句。也就是说,可以在其它客户端正在读取 MyISAM 表记录的同时时插入新记录。如果数据文件的中间没有空余的磁盘块的话,就不会发生冲突了,因为这种情况下所有的新记录都会写在数据文件的末尾(当在表的中间做删除或者更新操作时,就可能导致空洞)。当空洞被新数据填充后,并行插入特性就会自动重新被启用了。

如果想要在一个表上做大量的 Insert 和 Select 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现:

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;

mysql> Insert INTO real_table Select * FROM insert_table;

mysql> TRUNCATE TABLE insert_table;

mysql> UNLOCK TABLES;

InnoDB 使用行级锁,BDB 使用页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。

行级锁的优点有:

在很多线程请求不同记录时减少冲突锁。

事务回滚时减少改变数据。

使长时间对单独的一行记录加锁成为可能。

行级锁的缺点有:

比页级锁和表级锁消耗更多的内存。

当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。

当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。

使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。

表级锁在下列几种情况下比页级锁和行级锁更优越:

很多操作都是读表。

在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:

Update tbl_name SET column=value Where unique_key_col=key_value;

Delete FROM tbl_name Where unique_key_col=key_value;

Select 和 Insert 语句并发的执行,但是只有很少的 Update 和 Delete 语句。

很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。

表级锁和行级锁或页级锁之间的不同之处还在于:

将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插入)。也就是说,数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图。其它名有:时间行程,写复制,或者是按需复制。

原文: Versioning (such as we use in MySQL for concurrent inserts) where you can have one writer at the same time as many readers. This means that the database/table supports different views for the data depending on when you started to access it. Other names for this are time travel, copy on write, or copy on demand.

按需复制在很多情况下比页级锁或行级锁好多了。尽管如此,最坏情况时还是比其它正常锁使用了更多的内存。

可以用应用程序级锁来代替行级锁,例如MySQL中的 GET_LOCK() 和 RELEASE_LOCK()。但它们是劝告锁(原文:These are advisory locks),因此只能用于安全可信的应用程序中。

【编辑推荐】

【责任编辑:段燃 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4月21日会议总结(整理—祁子梁)

会议成果: 1.今天我们确定了软件版本的时间alphe版在12周做出来,在我们内部测试基本通过。 bate版在13周发布和其他组作交换测试,在14周release版发布并给其他人使用体验准备15周的演讲。 2.同时确定了部分功能实现顺序,”谁是卧底…

通达信金融终端_尘缘整合_V7.12

http://pan.baidu.com/s/1gvtPO http://pan.baidu.com/s/1xqrk6 通达信金融终端_尘缘整合_V7.12转载于:https://www.cnblogs.com/mier001/p/3679701.html

5天玩转mysql视频教程_六天带你玩转MySQL

教程列表:01数据库课程介绍02数据库(基础知识)03数据库(关系型数据库)04数据库(关系型数据库关键字说明)05数据库(SQL)06数据库(mysql数据库)07数据库(mysql服务器数据对象)08SQL基本操作(新增数据库)09SQL基本操作(查看数据库)10SQL基本操作(更新数据库)12SQL基本操…

winxp精简版没有IIS的解决办法

首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”,系统会自动使用记事本打开sysoc.inf这个文件。在sysoc.inf中找到“[Components]”这一段,因为是XP简化版,所以里面东西很少,在里面加上这段:“iisiis…

ant vue 兼容性问题_ant design for vue 关于table的一些问题

1、为table添加分页: :pagination"pagination"pagination: {defaultPageSize: 10,showTotal: (total) > 共${total} 条数据,total: 0,showSizeChanger: true,pageSizeOptions: [10, 20, 50],onShowSizeChange: (current, pageSize) > {this.pageSiz…

Coder-Strike 2014 - Finals (online edition, Div. 2) A. Pasha and Hamsters

水题 #include <iostream> #include <vector> #include <algorithm>using namespace std;int main(){int n,a,b;cin >> n >>a >> b;vector<int> apple(n1,0);int k;for(int i 0 ; i < a; i) {cin>>k;apple[k] 1;}for(…

如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!

mysql> SELECT * FROM mysql.gtid_executed;mysql.gtid_executed表是由MySQL服务器提供给内部使用的。它允许副本在副本上禁用二进制日志记录时使用GTIDs&#xff0c;并允许在二进制日志丢失时保留GTID状态。RESET MASTER命令&#xff0c;gtid_executed表将被清除。服务意外…

为JPA的本机查询API键入安全查询

当您使用JPA时-有时-JPQL无法解决问题&#xff0c;您将不得不使用本机SQL。 从一开始&#xff0c;像Hibernate这样的ORM就为这些情况保留了一个开放的“后门”&#xff0c;并为Spring的JdbcTemplate &#xff0c; Apache DbUtils或jOOQ提供了类似的API&#xff0c;用于纯SQL 。…

vb.net详解MDI窗体操作方法

MDI窗体可以避免打开窗体的时候被无数个子窗体困扰&#xff0c;我将为大家一一的介绍一下vb.net中MDI窗体的操作方法 一、如何创建MDI窗体&#xff1f; 1、创建mdi主窗体 新建建立一个默认空白的Windows应用程序&#xff0c;在Form1窗体的属性窗口中找到IsMDIContainer 属性&am…

lokijs可以用mysql_JavaScript实现的内存数据库LokiJS介绍和入门实例_javascript技巧

LokiJS是一个内存数据库&#xff0c;将性能考虑放在第一位。LokiJS支持索引和更快的文档访问&#xff0c;执行性能非常好(近50万OPS/秒)。其内置DynamicView类可以用于数据子集的索引&#xff0c;甚至获取更快的性能。*阅读这篇文章来看一看LokiJS的性能表现。LokiJS支持collec…

除了修改WEBCONFIG会导致WEB服务重启外,还有其他的什么操作会导致重启?

1、修改WEBCONFIG文件 2、BIN文件夹下&#xff0c;添加、删除、覆盖文件 3、IIS应用程序池回收 参考文章:http://blog.csdn.net/hb_gx/archive/2007/05/21/1619941.aspx转载于:https://www.cnblogs.com/niaowo/p/3686097.html

院队选拔赛

结束了&#xff0c;大半年的干活结束了&#xff0c;后面就是自己算法的大干活了。恩恩&#xff0c;目测就是下一站省赛了&#xff0c;早点睡觉。晚安~ 留个地址后面ak掉。hust stodgersma 转载于:https://www.cnblogs.com/stodgers/p/3898317.html

pandaboard 安装_linux fb设备(pandaboard) | 学步园

fb设备主要作用是获取帧buffer&#xff0c; 并设置&#xff0c;用于显示。fbmem是主要的框架层和抽象层。 每个具体的平台的帧设备是在调用platform_driver_register注册之后&#xff0c;由其probe函数调用create framebuffer将fbinfo设置给registered_fb(数组&#xff0c; 不同…

WinForm窗体之间传值

当程序需要将一个窗体中的一些信息传给另一个窗体并让其使用时,就需要用到这个知识点 方法一:通过接受参数的窗体的构造函数传值 例:现有Form1和Form2两个窗体,二者都包含一个文本框,Form1还包含一个按钮.程序从Form1开始运行,当点击Form1上的按钮时,Form2弹出,并将Form1中文本…

多线程写mysql数据库_多线程读写mysql数据库

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼unsigned int __stdcall scan(PVOID pM){char ip[20];strcpy(ip, (char*)pM);MYSQL mysql;MYSQL_RES* result;//初始化mysql句柄mysql_init(&mysql);//连接mysql数据库if(!mysql_real_connect(&mysql,"localhost"…

C++学习之路,漫长而遥远

一、C/C语言 如果你的基础很差&#xff0c; 建议不要一开始就学C语言&#xff0c;从C开始学起&#xff0c;对程序有个初步的认识&#xff0c;循序渐进。C语言的书嘛&#xff0c;先买一本 300 页以内的&#xff0c;把书中的每一个例子都通过键盘敲打进去到 Visual studio里面去&…

python图标icon_用Python提取exe图标icon

这里使用Python win32包中的win32gui.ExtractIconEx方法来提取exe的图标&#xff0c;除了安装Python&#xff0c;还需要到这里下载Pywin。第一份代码将指定的a.exe图标保存为bmp格式&#xff1a;import win32uiimport win32guilarge, small win32gui.ExtractIconEx(r"c:/…

python读取word图片_Python中如何读取Word中的图片

Python能够快速的编写、调试&#xff0c;用来提取各类软件中的图片再好不过了。今天小编就为大家带来在Python中提取Word图片的方法。方法需要批量的修改文件后缀名&#xff0c;并且解压之后将图片拷贝到需要存放的地方&#xff0c;然后将该文件夹清空留作下次的路径&#xff0…

layoutSubviews 详解

ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit——————- - (void)layoutSubviews - (void)layoutIfNeeded - (void)setNeedsLayout——————– - (void)setNeedsDisplay - (void)drawRectlayoutSubviews在以下情况下会被调用&#xff…

jdk中的设计模式_JDK中的设计模式

jdk中的设计模式Zen的JCG合作伙伴Brian Du Preez 是IT领域的合作伙伴&#xff0c; 在收集JDK中最常见的设计模式方面做得非常出色。 模式列表的确令人印象深刻且很长&#xff0c;因此让我们不再ba不休&#xff0c;然后将其呈现给您。 前几天&#xff0c;我在Enterprise Dev上看…