1.Lock 锁 – Isolation
实用:Mysql 死锁后如何解决
show status like 'table%';
show processlist;
show full processlist;
找到锁进程,kill id ;
1.读写锁
LOCK TABLES products WRITE; 写锁
[排他锁 exclusive lock]
锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞…..- LOCK TABLES products READ;读锁
[共享锁 shared lock]
锁定之后,无论是当前线程还是其他线程均只能读操作,写操作全部被堵塞…. - UNLOCK TABLES; 解锁:
2.锁机制
引擎锁类型
MyISAM Memory – table
BDB – table + page
Innodb – table + row锁类型 比对 (开销、加锁、死锁、粒度、并发)
table: 开销小,加锁快;不会出现死锁;
锁定粒度大,发生锁冲突的概率最高,并发度最低page: 开销和加锁时间界于表锁和行锁之间;会出现死锁;
锁定粒度界于表锁和行锁之间,并发度一般row: 开销大,加锁慢;会出现死锁;
锁定粒度最小,发生锁冲突的概率最低,并发度也最高
Lock tables orders read local, order_detail read local; Select sum(total) from orders; Select sum(subtotal) from order_detail; Unlock tables;
3.MVCC
MultiVersion Concurrent Control 多版本并发控制 ==> 可重复读,Mysql 依靠此解决了幻读问题
1.Innodb - MVCC: 每行记录的后面保存两个隐藏的列实现
列1:行创建时间
列2:行过期时间
存储的并非时间值,而是系统版本号
通过数据多版本来做到读写分离,从而实现不加锁读进而做到读写并行
2.[快照] 一致性视图
可重复读:事务开始时生成一个全局事务快照
读提交: 每次执行语句一个快照
快照可以读到 当前 transaction 内提交的,或快照创建前提交的版本数据
3.依赖 undo log 与 read view 实现
undolog: 记录某行数据的多个版本的数据 read view: 判断当前版本数据的可见性
参考:
文档信息
- 本文作者:jiushun.cheng
- 本文链接:https://minipa.github.io/2017/07/21/mysql-lock/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)