mysql 开发进阶篇系列 9 锁问题 (Innodb 行锁实现方式)
一.概述
Innodb 行锁是通过给索引上的"索引项"加锁来实现的。这一点与(oracle,sql server)不同后者是通过在数据块中对相应的数据行加锁。这意味着只有通过索引条件检索数据,innodb才使用行级锁,否则 innodb将使用表锁。
在实际应用中,特别要注意innodb行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。下面来实际演示说明:
1. innodb 的表条件CityCode不使用索引时,使用的是表锁例子
-- 查询表中数据共二条
SELECT * FROM city;

-- 条件字段CityCode不走索引
EXPLAIN SELECT * FROM city WHERE CityCode=''

|
会话1 |
会话2 |
|
SET autocommit=0; SELECT * FROM city WHERE CityCode='001'; city_id country_id cityname CityCode 14 2 深圳 001 |
SET autocommit=0; SELECT * FROM city WHERE CityCode='002'; city_id country_id cityname CityCode 15 2 长沙 002 |
|
-- 加锁 SELECT cityname FROM city WHERE CityCode='001' FOR UPDATE ; cityname 深圳 |
|
|
-- 加锁 SELECT cityname FROM city WHERE CityCode='002' FOR UPDATE ; 等待... 错误代码: 1205 Lock wait timeout exceeded; try restarting transaction |
通过上面的案例 会话1只给一行加了排它锁, 但会话2在请求其它行的排他锁时,却出现了锁等待。原因就是在没有索引的情况下,innodb只能使用表锁。
2. innodb 的表条件CityCode使用索引时,使用的是行锁例子
-- 添加索引
ALTER TABLE city ADD INDEX ix_citycode(CityCode)
-- CityCode走索引
EXPLAIN SELECT * FROM city WHERE CityCode=''

|
会话1 |
会话2 |
|
SET autocommit=0; SELECT * FROM city WHERE CityCode='001'; city_id country_id cityname CityCode 14 2 深圳 001 |
SET autocommit=0; SELECT * FROM city WHERE CityCode='002'; city_id country_id cityname CityCode 15 2 长沙 002 |
|
-- 加锁 SELECT cityname FROM city WHERE CityCode='001' FOR UPDATE ; cityname 深圳 |
|
|
-- 加锁 SELECT cityname FROM city WHERE CityCode='002' FOR UPDATE ; cityname 长沙 |
mysql 开发进阶篇系列 9 锁问题 (Innodb 行锁实现方式)的更多相关文章
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- mysql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)
一.概述 在数据库中,数据是属于共享资源,为了保证并发访问的一致性,有效性,产生了锁.接下来重点讨论mysql锁机制的特点,常见的锁问题,以及解决mysql锁问题的一些方法或建议. 相比其他数据库,m ...
- mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)
1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...
- mysql 开发进阶篇系列 15 锁问题 (总结)
1. innodb 行锁是基于索引实现的,如果不通过索引访问数据,innodb会使用表锁. http://www.cnblogs.com/MrHSR/p/9376086.html 2. Innodb ...
- mysql 开发进阶篇系列 7 锁问题(innodb锁争用情况及锁模式)
1 .获取innodb行锁争用情况 1.1 通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况 SHOW STATUS LIKE 'innodb_row_lock%' 通过in ...
随机推荐
- DataTable调整顺序
DataTable中手动调整列的顺序 DataTable中手动调整列的顺序(列序,reorder,Rearrange)DataTable dt = new DataTable(); dt.Column ...
- SpringBoot_配置文件
Properties配置 SpringBoot中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources 目录下的appl ...
- Codeforces 888 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意简述:给一个数列,问有多少个峰值点(同时比两边都大/小的点) 思路:按照题意模拟. 代码: #include<bit ...
- For语句的衍生对象
for in语句: for...in 语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作). for...in 语句用于对数组或者对象的属性进行循环操作. for ... in 循环中的 ...
- bootstrap-table使用详解
尴尬,标记果然到了一周之后.... 首先引入文件不必提,引入bootstrap和bootstrap-table <link rel="stylesheet" href=&qu ...
- Docker构建JDK环境
创建目录mkdir oracle-jdk 构建文件touch Dockerfile # Docker for jdk-8u181 FROM centos:7 MAINTAINER ggza " ...
- [转] Snapshotting with libvirt for qcow2 images
http://kashyapc.com/2011/10/04/snapshotting-with-libvirt-for-qcow2-images/ Libvirt 0.9.6 was recentl ...
- [转] KVM虚拟化技术生态环境介绍
KVM虚拟化技术生态环境介绍 http://xanpeng.github.io/wiki/virt/kvm-virtulization-echosystem-intro.html kvm和qemu/q ...
- Email发展历史
据我所知:1987年9月20日,有“中国互联网第一人”之称的钱天白从北京经意大利向前联邦德国卡尔斯鲁厄大学发出了中国第一封电子邮件,内容是“ 穿越长城,走向世界”.这是中国人在网络上的第一步,他开创了 ...
- 2018年3月24日上海MVP线下技术交流活动简报
2018年3月24日下午,几位上海MVP自发组织了一次线下的技术交流会,主要由MVP胡浩牵头,我(陈晴阳).刘鑫.朱兴亮和胡浩各自做了一次主题演讲,具体主题是: 陈晴阳:<这还是我认识的Visu ...