mysql锁,事务
什么是事务
事务定义了一个服务操作序列,由服务器保证这些操作序列在多个客户并发访问和服务器出现故障情况下的原子性
事务的属性
A --redo&undo
C --undo
I --lock
D --redo
事务编程
锁的概念
lock与lath的区别
--对象:事务/线程
--保护:数据库对象/内存结构
--持续时间:长/短
--模式:表锁行锁/互斥
--死锁:有/无
InnoDB锁分析
--IS,IX,S,X
--record lock,gap lock,next-key lock
MDL锁分析
死锁原理与分析
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
SET GLOBAL tx_isolation='REPEATABLE-READ';
SET SESSION tx_isolation='SERIALIZABLE';
level:
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
mysql> set tx_isolation='read-committed';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.00 sec)
set tx_isolation='repeatable-read';
SET GLOBAL tx_isolation='READ-COMMITTED';
SET GLOBAL tx_isolation='REPEATABLE-READ';
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id= w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id= w.requesting_trx_id;
select * from information_schema.innodb_trx\G
performance_schema.events_statements_current
lock_wait_timeout=n
--
create table iso_t1 (id int auto_increment primary key,name1 varchar(10));
insert iso_t1 values (null,'aaa'),(null,'bbbb');
RC级别,READ-COMMITTED,
设置set autocommit=1;
session 1: select * from iso_t1;
session 2: drop table iso_t1;--成功
设置set autocommit=0;
session 1: select * from iso_t1;
session 2: drop table iso_t1;--失败,session加了metadata lock(mdl)锁模式为share_read
,session2 想加x锁,2个互斥
Waiting for table metadata lock | drop table iso_t1
RR级别
SET GLOBAL tx_isolation='REPEATABLE-READ';
设置set autocommit=1;
session 1: select * from iso_t1;
session 2: drop table iso_t1;--成功
设置set autocommit=0;
session 1: select * from iso_t1;
session 2: drop table iso_t1;--失败,Waiting for table metadata lock
1.MySQL参数autocommit生产环境设1还是0?为什么?
设置autocommit=0,不自动提交,可以rollback操作,但是每一个select后需要进行commit,
不管事务级别是RR/RC,不然会加mdl锁.
所以pro上面设置为autocommit=1.
2.MySQL参数tx_isolation生产环境上大多数是设什么值,为什么?
生产环境tx_isolation,事务隔离级别设置为已提交读'READ-COMMITTED'--RC
RC:并发高,开销低,不会产生gap锁,但是不支持binlog的statement模式,
语句级快照,每条语句,新建readview
RR:支持gap锁,事务级快照读,一个事务对应一个readview
加锁冲突严重,不支持semi-consistend read,不支持early unlock
3.与MySQL锁相关的有哪些因素?
mysql innodb锁相关
1 事务隔离级别RR/RC
2 主键/唯一索引/普通索引/没有索引
3 autocommit=1/0
--innodb的行锁是逐步获得的
--语句1,2加锁获取的记录是多行
Repeatable Read隔离级别下,id列上有一个非唯一索引,对应SQL:delete from t1 where id = 10;
首先,通过id索引定位到第一条满足查询条件的记录,加记录上的X锁,加GAP上的GAP锁,然后加主键
聚簇索引上的记录X锁,然后返回;然后读取下一条,重复进行。直至进行到第一条不满足条件的记录
[11,f],此时,不需要加记录X锁,但是仍旧需要加GAP锁,最后返回结束
--
GEN_CLUST_INDEX --innodb表无主键,默认rowid
由于表定义没有显示的索引,而InnoDB又是索引组织表,会自动创建一个索引,这里面叫index GEN_CLUST_INDEX
lock_mode X:next key(x+gap)
lock_mode X locks rec but not gap:记录锁
lock_mode x plus gap
数据锁模式
– 数据锁:仅仅锁住数据
– LOCK_IS, LOCK_S, LOCK_IX, LOCK_X
– 意向锁: LOCK_IS, LOCK_IX
? 表级锁;加记录锁前必须先加意向锁;
? 功能: 杜绝行锁与表锁相互等待
InnoDB锁-锁模式(cont.)
? 非数据锁模式
– 不锁数据,标识数据前GAP的加锁情况;非数据锁与数据锁之间不冲突
– LOCK_ORDINARY
? next key锁,同时锁住记录(数据),并且锁住记录前面的Gap
– LOCK_GAP
? Gap锁,不锁记录,仅仅记录前面的Gap
– LOCK_NOT_GAP
? 非Gap锁,锁数据,不锁Gap
– LOCK_INSERT_INTENSION
? Insert操作,若Insert的位置的下一项上已经有Gap锁,
则获取insert_intension锁,等待Gap锁释放
– LOCK_WAIT
? 当前锁不能立即获取,需要等待
--innodb锁分析
mysql> create table t2(a int,b int,key(b))engine=innodb;
Query OK, 0 rows affected (0.10 sec)
mysql> insert into t2 values(1,10),(2,10),(2,20),(3,30);
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0 Warnings: 0
--session1
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t2 where b=20 for update;
+------+------+
| a | b |
+------+------+
| 2 | 20 |
+------+------+
1 row in set (0.02 sec)
--session2
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t2 where b=10 order by a for update;
+------+------+
| a | b |
+------+------+
| 1 | 10 |
| 2 | 10 |
+------+------+
2 rows in set (0.00 sec)
session1
mysql> update t2 set b=10 where a=10;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
session2
mysql> select * from t2 where b=10 order by a for update;
+------+------+
| a | b |
+------+------+
| 1 | 10 |
| 2 | 10 |
+------+------+
2 rows in set (0.00 sec)
--session1
1 session 1对b索引的(20)加锁;lock_rec(32)+lock_x(5)+lock_ordinary(0)
2 session 1对聚簇索引的(2,20加锁);lock_rec_not_gap(1024)+lock_rec+lock_x
3 session 1对b索引的(30)加锁;lock_gap(512)+lock_x
4 session 1对b索引上,创建两个lock实例
--session2
1 b索引上的(1,10),(2,10),加锁,lock_rec(32)+lock_x(5)+lock_ordinary(10)
2 b索引上的(2,20),加锁lock_gap(512)+lock_x
3 聚簇索引上的(1,10),(2,10)加锁,lcok_rec_not_gap(1024)+lock_rec+lock_x
4 session2 在b索引上,同样需要创建2个lock实例
5 session2 不需要等待session1的提交,(2,20)上的锁,并不冲突
InnoDB多版本-更新
测试各种更新场景下,聚簇索引记录/二级索引记录的变化
create table test (id int primary key, comment char(50)) engine=innodb;
create index test_idx on test(comment);
insert into test values (1, 'aaa');
insert into test values (2, 'bbb');
InnoDB多版本-更新(cont.)
更新主键
update test set id = 9 where id = 1;
-旧记录标识为删除
– 插入一条新纪录
– 新旧记录前项均进入回滚段
更新非主键
update test set comment = 'ccc' where id = 9;
InnoDB更新总结
– 更新主键,聚簇索引/二级索引均无法进行in place update,均会产生
两个版本
– 更新非主键,聚簇索引可以in place update;二级索引产生两个版本
– 聚簇索引记录undo,二级索引不记录undo
– 更新聚簇索引,记录旧版本会进入Rollback Segment Undo Page
– 更新二级索引,同时需要判断是否修改索引页面的MAX_TRX_ID
– 属于同一事务的undo记录,在undo page中保存逆向指针
RR vs RC
– Read Committed
? 优势
– 高并发,低锁开销: semi-consistent read
– no gap lock; early unlock
? 劣势
– 不支持statement binlog
– 语句级快照读:每条语句,新建ReadView
– Repeatable Read
? 优势
– 支持gap lock; statement binlog
– 事务级快照读:一个事务,对应一个ReadView
? 劣势
– 并发冲突高,加锁冲突更为剧烈
– 不支持semi-consistent read;不支持early unlock
mysql锁,事务的更多相关文章
- 温故知新-Mysql锁&事务&MVCC
文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...
- mysql 锁 事务隔离级别
主题 最近在看mysql相关的书籍.实验了一些内容.分享一下,主要是关于事务隔离级别(read-committed和repeatable-read)和锁相关的. 很多网上文章上都能搜索到 read-c ...
- 深入理解 MySQL ——锁、事务与并发控制
本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...
- 13、mysql锁
mysql锁 事务的隔离性是通过锁来实现的.为保证数据的一致性,需要锁对并发事务操作进行控制.同时锁机制也为实现MySQL的各个隔离级别提供了保证. mysql并发事务访问相同的记录会出现什么问题(在 ...
- Mysql锁机制--并发事务带来的更新丢失问题
Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...
- MySQL 锁信息和事务
1 锁概念 1.1 什么是锁 锁是数据库系统区别于文件系统的一个关键特性.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性.例如:操作缓冲池中的LRU列表,删除.添加.移动L ...
- Mysql 锁机制和事务
InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得 ...
- 秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现
Reference: http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...
- Mysql数据库事务的隔离级别和锁的实现原理分析
Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...
- 面试必问的MySQL锁与事务隔离级别
之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...
随机推荐
- Spring获取bean的几种方式
工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean ...
- python之list,tuple,str,dic简单记录(一)
list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这样python就知道你是在指明一个列表.一旦你创建了一个列表,你就可以添加 ...
- Ajax-07 基于Ajax实现跨域请求
跨域 跨域名访问,如c1.com域名向c2.com域名发送请求 本质:浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. django服务端准备 url. ...
- 【Demo】CSS图像拼合技术
图像拼合 图像拼合 - 简单实例 <style> img.home { width: 46px; height: 44px; background: url(/images/img_nav ...
- 在Hive中使用Avro
作者:过往记忆 | 新浪微博:左手牵右手TEL | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明博客地址:http://www.iteblog.com/文章标题:<在Hiv ...
- IOS-CoreLocation
一.简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如 导航:去任意陌生的地方 周边:找餐馆.找酒店.找银行.找电影院 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入 ...
- centos 使用yum安装MySQL 5.7
想在centos上安装一个MySQL,使用yum install mysql-server 安装提示仓库没有包,也是醉了. 找了很多博客,发现一个很好用的,推荐给大家. 地址:https://blog ...
- deep learning新征程(二)
deep learning新征程(二) zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2016-4-5 声明 1)该Dee ...
- [eShopOnContainers 学习系列] - 03 - 在远程 Ubuntu 16.04 上配置开发环境
直接把 md 粘出来了,博客园的富文本编辑器换成 markdown,没啥效果呀 ,先凑合吧.实在不行换地方 # 在远程 Ubuntu 16.04 上配置开发环境 ## 零.因 为什么要用这么麻烦的 ...
- HDU 1410 PK武林盟主
Problem Description 枫之羽认为自己很强,想当武林盟主,于是找现任武林盟主氢氧化铜挑战.氢氧化铜欣然接受了挑战,两人约好于下个月的月圆之夜在HDU校园内的三根柱子上进行决战.这场PK ...