innodb事务锁
- 控制对共享资源进行并发访问
- 保护数据的完整性和一致性

.png)
.png)

.png)

mysql> show status like '%innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
+-------------------------------+-------+
5 rows in set (0.00 sec)
- 共享锁(S)-读锁-行锁
- 排他锁(X)-写锁-行锁
- 意向共享锁(IS)-表级 :事务想要获得一张表中某几行的共享锁
- 意向排他锁(IX)-表级:事务想要获得一张表中某几行的排他锁
- 意向锁总是自动先加,并且意向锁自动加自动释放
- 意向锁提示数据库这个session将要在接下来将要施加何种锁
- 意向锁和X/S 锁级别不同,除了阻塞全表级别的X/S锁外其他任何锁
.png)

select * from tb_test for update;
自动:update,delete 前
.png)

mysql>show global variables like "%wait%"
- 只有条件走索引才能实现行级锁 a)
- 索引上有重复值,可能锁住多个记录 b)
- 查询有多个索引可以走,可以对不同索引加锁 c)
- 是否对索引加锁实际上取决于Mysql执行计划
mysql> show create table t2\G;
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 mysql> select * from t2;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 3 |
+------+------+ 此时A连接 在b =2 时加 写锁;
mysql> select * from t2 where b =2 for update;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
而此时再B连接中再对b=3,加写锁时,失败;
mysql> select * from t2 where b=3 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> show create table t2\G;
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> select * from t2;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 3 |
| 2 | 9 |
+------+------+ 在A连接中,在a=1,b=2处加一个写锁;实际上 是在a=1这个索引上加的锁
mysql> select * from t2 where a=1 and b=2 for update;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec) 在B连接中,在a=1 and b=3处加写锁失败,因都是a=1这个索引,而A中已经对a=1这个索引的行加过了锁;
mysql> select * from t2 where a =1 and b=3 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 此时B连接是可以对 a=2 and b =9 这一行中,在a=2 这个索引上加锁的;
mysql> select * from t2 where a=2 and b =9 for update ;
+------+------+
| a | b |
+------+------+
| 2 | 9 |
+------+------+
mysql> select * from t2 where b =9 for update ;
mysql> show create table t2\G;
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
KEY `a` (`a`),
KEY `b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql> select * from t2;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 3 |
| 2 | 9 |
+------+------+
在A连接中对 a=1 and b=2 加锁;
mysql> select * from t2 where a =1 and b =2 for update;
+------+------+
| a | b |
+------+------+
| 1 | 2 |
+------+------+ 此时B连接中对a =1 and b=3 ,也是可以加锁的;这是因为mysql 可以从a=1这个索引来加锁,也可以对b=3加锁;
所以就与上面b)中只能对a=1索引来加锁 区别开来; mysql> select * from t2 where a =1 and b =3 for update;
+------+------+
| a | b |
+------+------+
| 1 | 3 |
+------+------+
mysql> select * from t2;
+------+------+
| a | b |
+------+------+
| 20 | 2 |
| 24 | 4 |
| 27 | 5 |
| 27 | 6 |
| 27 | 8 |
| 30 | 6 |
| 31 | 4 |
| 32 | 9 |
+------+------+
8 rows in set (0.00 sec) 在A连接中给a=27 加锁(a 是有索引的)
mysql> select * from t2 where a=27 for update;
+------+------+
| a | b |
+------+------+
| 27 | 5 |
| 27 | 6 |
| 27 | 8 |
+------+------+
3 rows in set (0.00 sec)
- 由一句单独的sql语句在一个对象上持有的锁的数量超过了阈值,默认这个阈值为5000.值得注意的是,如果是不同对象,则不会发生锁升级。
- 锁资源占用的内存超过了激活内存的40%时就会发生锁升级

.png)

.png)
- 了解触发死锁的sql所在事务的上下文
- 根据上下文语句加锁的范围来分析存在争用的记录
- 通常改善死锁的主要方法:
- 更新丢失
- innodb意向锁:
- 表锁
- 自动施加、自动释放
- 为了揭示事务下一行将被请求的锁类型
- S锁:in share mode
- X锁:for update
- innodb行锁特点:
- 只有条件走索引才能实现行锁
- 索引上有重复值可能锁住多个记录
- 查询有多个索引可以走,可以对不同索引加锁
- gap lock:间隙锁,消灭幻读
- 死锁解决:数据库挑回滚代价较小的事务回滚;
- 死锁预防:
- 单表,更新条件排序
- 避免跨表事务,缩短事务长度
- 锁升级:
- 单独sql语句在单个对象的锁数量超过阙值
- 锁资源占用的内存超过了激活内存的40%;
- innodb根据页进行加锁,并采用位图方式,定位到行的,所需资源较小
innodb事务锁的更多相关文章
- MySQL · 引擎特性 · InnoDB 事务锁简介
https://yq.aliyun.com/articles/4270# zhaiwx_yinfeng 2016-02-02 19:00:43 浏览2194 评论0 mysql innodb lock ...
- innodb事务锁的一些常见数据结构
lock_sys_t 整个innodb的锁系统管理结构体,定义在lock0lock.h中.在lock0lock.cc中有一个lock_sys_t的全局指针lock_sys, 由lock_sys_cre ...
- Innodb 锁系列2 事务锁
上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...
- InnoDB事务和锁
InnoDB支持事务,MyISAM不支持事务. 一.事务的基本特性 ACID特性 1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 2.一致性( ...
- Innodb行锁源码学习(一)
Innodb是mysql数据库中目前最流行的存储引擎,innodb相对其它存储引擎一个很大的特点是支持事务,并且支持行粒度的锁.今天我重点跟大家分享下innodb行锁实现的基础知识.由于篇幅比较大,文 ...
- Mysql InnoDB行锁实现方式(转)
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- Mysql InnoDB行锁实现方式
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- 查看事务锁:innodb_trx+innodb_locks+innodb_lock_waits
当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,要解决是一件麻烦的事情:特别是当一个SQL ...
- MySQL · 引擎特性 · InnoDB 事务子系统介绍
http://mysql.taobao.org/monthly/2015/12/01/ 前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoD ...
随机推荐
- laravel5.2总结--服务提供者,契约(Contracts)
首先理解两个概念 1.契约:一组定义了框架核心服务的接口 2.服务提供者:所有 Laravel 应用程序启动的中心所在. 包括你自己的应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者 ...
- JS 小数处理
parseInt(7/2);//丢弃小数部分,保留整数部分 Math.ceil(7/2);//向上取整 Math.floor(7/2);//向下取整 Math.round(7/2);//四舍五入 // ...
- 浅谈我所见的CSS组织风格
1.简单组织(见习级) projectName ├─css | └style.css 优点:简单,单一文件,适合一些简单项目. 缺点:过度集中,没有模块化,无法适应大型项目. 2.公共组织(见习级) ...
- Kafka 配置参数
Broker Configs Property Default Description broker.id 每个broker都可以用一个唯一的非负整数id进行标识:这个id可以作为broker的 ...
- json对象中根据主键判断是否有重复数据
function funCheckRepeat() { var ids = $(gridId).jqGrid('getGridParam', 'selarrrow'); if (ids.length ...
- easyui datagrid 学习 (一)
注意:当使用谷歌浏览器时!需要 设置style="overflow:hidden",这样则可以去掉滚动条!(该样式添加到layout上!) fit:属性 自动填父容器, borde ...
- Struts2 标签库与OGNL的使用
- NetScaler 12.1 Deploy Package
NetScaler 12.1 Deploy Package NS_VPX_Deploy_Package 百度网盘共享地址https://pan.baidu.com/s/1OT0Hxuz6ZBLwwM5 ...
- 编程风格——代码中特殊的注释技术——TODO、FIXME和XXX的用处
代码中特殊的注释技术——TODO.FIXME和XXX的用处 前言:今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上,在阅读一些开源代码时 ...
- dockerfile 镜像构建
1.镜像的构建有手动与自动方式,这里我们介绍自动化的构建方式 ,dockerfile常用指令如下 2.构建指令build Usage: docker image build [OPTIONS] PAT ...