轻松掌握MySQL数据库锁机制的相关原理

作者:迪伦 时间:2008-12-17 15:23:00 

在一个update和insert操作频繁的表中,少量数据测试的时候运行良好,在实际运营中,因数据量比较大(21万条记录),会出现死锁现象,用show processlist查看,可以看到一个update语句状态是Locked,一个delete语句状态是Sending data。查看了一下参考手册,把锁定相关的资料整理下来,以便自己记录和追踪该问题的解决情况:

MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB 表进行行级锁定。在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型就比另一个好。一切取决于应用程序,应用程序的不同部分可能需要不同的锁类型。为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。例如,大多数Web应用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。基本MySQL MyISAM设置已经调节得很好。

在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。

对WRITE,MySQL使用的表锁定方法原理如下:

◆ 如果在表上没有锁,在它上面放一个写锁。

◆否则,把锁定请求放在写锁定队列中。

对READ,MySQL使用的锁定方法原理如下:

◆如果在表上没有写锁定,把一个读锁定放在它上面。

◆否则,把锁请求放在读锁定队列中。

当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。

这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。

如果INSERT 语句不冲突,可以自由为MyISAM 表混合并行的INSERT 和SELECT 语句而不需要锁定。

InnoDB 使用行锁定,BDB 使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB 自动获得行锁定,BDB 获得页锁定,而不是在事务启动时获得。

行级锁定的优点:

· 当在许多线程中访问不同的行时只存在少量锁定冲突。

· 回滚时只有少量的更改。

· 可以长时间锁定单一的行。

行级锁定的缺点:

· 比页级或表级锁定占用更多的内存。

· 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。

· 如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表,比其它锁定明显慢很多。

· 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。

标签:
0
投稿

猜你喜欢

  • MySql .frm数据库文件导入的问题

    2024-01-18 19:08:09
  • pytorch 如何使用batch训练lstm网络

    2023-10-18 04:46:02
  • python实现K最近邻算法

    2021-06-18 04:05:46
  • MySQL下使用Inplace和Online方式创建索引的教程

    2024-01-18 11:28:18
  • Python中人脸图像特征提取方法(HOG、Dlib、CNN)简述

    2021-09-16 21:38:59
  • Python解释执行原理分析

    2022-12-13 22:11:54
  • 详解Python中表达式i += x与i = i + x是否等价

    2023-07-29 06:51:12
  • Go语言中调用外部命令的方法总结

    2024-05-13 10:44:09
  • python list转置和前后反转的例子

    2022-04-26 10:39:55
  • 关于Ajax responseText 中文乱码问题

    2008-02-12 16:30:00
  • javascript学习随笔(编写浏览器脚本 Navigator Scripting )

    2024-04-28 09:49:39
  • Mysql双主搭建的方法步骤

    2024-01-29 05:57:50
  • MySQL Dump/Restore

    2010-10-14 13:49:00
  • tensorflow模型的save与restore,及checkpoint中读取变量方式

    2022-07-27 17:41:43
  • ASP同一站点下gb2312和utf-8页面传递参数乱码的终极解决方法

    2011-02-20 11:00:00
  • Python中创建对象列表的实现示例

    2023-08-15 07:20:35
  • numpy中的transpose函数中具体使用方法

    2023-04-28 23:46:44
  • Python爬虫之正则表达式基本用法实例分析

    2022-12-20 17:02:16
  • MySQL权限详解

    2011-02-16 12:20:00
  • python实现Decorator模式实例代码

    2022-05-10 06:04:56
  • asp之家 网络编程 m.aspxhome.com