MySQL 锁问题
一、MySQL中不同的存储引擎支持不同的锁机制
(A) MyISAM 和 MEMORY 支持表级锁
(B) BDB 支持页面锁,也支持表级锁
(C) InnoDB 支持行级锁,也支持表级锁,默认是行级锁。
这三种锁的特性如下:
表级锁:开销小,加锁快,不会死锁,粒度大,冲突概率高,并发度低
行级锁:开销大,加锁慢,会死锁,粒度小,冲突概率低,并发度高
页面锁:开销中,加速中,会死锁,粒度中,冲突概率中,并发度中
二、MyISAM表锁
(A) 检查 table_locks_waited 和 table_locks_immediate 状态变量来分析系统上表锁的争夺情况。
(B) 表锁有分为:共享读锁和独占写锁
(C) 在查询语句前,会自动给涉及的所有表加读锁,在更新操作前,会自动给涉及的所有表加写锁。
(D) 总是一次性获得所需的所有锁,这样就不会出现死锁。同时SQL中出现的表别名也需要锁定。
(E) 并发插入:一定条件下,MyISAM表支持查询和插入,系统变量concurrent_insert 是否支持并发插入
0:不允许并发插入
1:表中没有空洞,运行读表的同时,另一个进程表尾插入
2:运行表尾插入。
三、MyISAM的锁调度
(A) 写优先策略:可通过参数 low-priority-updates 修改;通过命令修改;修改属性等方法。
(B) 注意:一条长时间运行的查询语句可能会使写进程”饿死“。
四、InnoDB锁问题
一是支持事务、二是采用行级锁
事务是一组SQL语句组成的逻辑处理单元,具有ACID属性,原子性、一致性、隔离性和持久性。
并发事务访问带来的问题:更新丢失、脏读、不可重复读、幻读。
(A) 可以通过检测InnoDB_row_lock状态变量来分析系统上行锁的争夺情况
(B) InnoDB实现了两种类型的行锁:共享锁和排他锁。内部使用了两种表级别的意向锁。
(C) 行锁是通过给索引上的索引项加锁来实现的。意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
(D) 注意InnoDB的锁机制是间隙锁,这将导致锁定比实际更多的记录行,尽量采用相等条件而不是范围条件来避免此类问题。同时:如果使用相等条件给一个不存在的记录加锁,也会导致间隙锁。
五、回复和复制的需要,对InnoDB锁机制的影响
(A) MySQL通过BINLOG记录执行成功的INSERT、UPDATE、DELETE等更新数据的SQL语句。并以此实现MySQL数据库的恢复和主从复制。
MySQL的恢复是SQL语句级别的,也就是重新执行BINLOG中的SQL语句。
Binlog是按照事务提交的先后顺序记录的,恢复也是按照这个顺序。
根据上面的两个特点:我们知道一个事务提交前,其他事务不能插入满足其锁定条件的任何记录,也就是不允许出现幻读。
像 insert...select... 和 create table... select... 语句,虽然源表是查询,还是会对源码加锁,这是为了保证恢复和复制的一致性。不建议使用此种SQL语句。
(B) 不同隔离级别下的一致性读及锁的差异
不同隔离级别下,InnoDB实现一致性读和隔离级别的手段是不同的。
(C) 默认应该使用行锁,某些情况考虑使用表锁
事务需要更新大部分了或者全部数据,表又比较大。
事务设计多个表,比较复杂,可能引起死锁。
注意:表锁是由MySQL Server负责的,需要正确的设置。需要先将autocommit设为0,才给表加锁,事务结束前不要用unlock tables 释放表锁,其会隐式地提交事务;commit或rollback 并不能释放用lock tables 加的表级锁。
六、关于死锁
InnoDB一般都能自动检测到死锁,并释放某个事务并回退。但在设计外部锁和表级锁时,不能完全可能。需要设置锁等待超时参数 innodb_lock_wait_timeout 来解决。此参数可解决大量事务挂起的问题。
(A) 不同的程序尽量以相同的顺序来访问多个表。
(B) 批量方式处理数据时,事先对数据排序,每个线程固定顺序来处理记录,降低死锁出现的可能。
(C) 提前申请排他锁,而不是先申请共享锁,需要时再申请排他锁。
(D) 在程序设计中捕获和处理死锁是一个好的编程习惯。
(E) 使用 show innodb status 来查看事务的状态。
七、小结
MySQL 锁问题的更多相关文章
- mysql锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...
- Mysql锁初步
存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...
- mysql锁表机制及相关优化
(该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...
- MySQL锁系列3 MDL锁
http://www.cnblogs.com/xpchild/p/3790139.html MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...
- 01 MySQL锁概述
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...
- Mysql锁机制介绍
Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- MySQL锁等待分析【2】
MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...
- MySQL锁与MVCC
--MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...
- MySQL锁总结
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...
- Mysql锁机制--并发事务带来的更新丢失问题
Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...
随机推荐
- kubernetes单机板
参考地址: *** http://blog.csdn.net/carter115/article/details/51121223 ** http://www.cnblogs.com/dongdong ...
- 【C#】菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类
VS 2015菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类
- 用vue.js学习es6(一):基本工具及配置
一.工具: sublime,node.js,npm 1.安装sublime 的es6插件: (1).在sublime中按Ctrl+`调出console (2).粘贴以下代码到底部命令行并回车(subl ...
- 安卓 Handler
1. 看视频有关Handler操作,没有用过,里面的老师也没有讲(新手太难了) 查了一下资料. 一.Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释:当应用程序 ...
- java第二周周学习总结
java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){ 执行语句; //一段代码} 初始化表达式:初 ...
- COGS2531. [HZOI 2016]函数的美 打表+欧拉函数
题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...
- SUSE系统查看各种信息
系统版本 # 显示内核版本 uname -a # 可看gcc版本 cat /proc/version # 显示linux基准库 lsb_release -a # 显示Suse版本准确版本 cat /e ...
- substr()函数
substr 定义于头文件 <string> string substr (size_t pos = 0, size_t len = npos) const;复制子字符串,要求从指定位置开 ...
- ios相同版本升级
公司新发布ios,因为各种错误以及审核不通过造成app未能上传,而app在提交的时候不能上传相同的版本号,造成app还没有正式的上传上传已经将版本号升级到1.0.6 解决方法: 在Xcode上,查看项 ...
- iframe的sandbox使用
sandbox:限制iframe的权限,解决安全性问题. 定义 如果被规定为空字符串(sandbox=""),sandbox 属性将会启用一系列对行内框架中内容的额外限制.sand ...