mysql行锁和死锁检测
行锁顾名思义,就是针对单行数据加锁,在mysql中,锁的实现是由引擎层实现的,MyISAM引擎就不支持行锁
不支持行锁就意味着并发控制只能使用表锁,也就是说同一时间,在这个表上只能有一个更新在执行,这就会
影响到业务的并发度。InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之一。
两阶段锁协议
先举个例子,事务B的语句执行的时候会发生什么现象?这取决于事务A在执行完两条语句后持有那些锁,以及在什么时候释放?
大家可以自己做个实验,是这样的,事务B在执行这条语句时会被阻塞,大家会不会有疑惑,
前面两条语句不是执行完了吗?
为什么还会阻塞?
其实事务A的加锁时机是执行第一条语句的时候,释放锁的时候是commit完以后
但是事务B是在事务A commit前执行的
这个时候事务A还持有id=1这行数据的锁,所以事务B会被阻塞。
知道了这个原理对于我们有什么启示呢?
既然知道了锁的释放是在commit之后
那么我们就可以把最可能造成锁冲突
最可能影响并发度的锁尽量往后放
举个例子:
业务:顾客A要在影院B买一张电影票
操作:
1.从顾客A的账户余额中减掉电影票的价格
2.将影院B的账户余额增加这张电影票价
3.增加一条操作日志
大家想想看,这三个操作,那个最容易影响到并发度会造成锁冲突
很明显是第二个操作,为啥呢?想想看操作1中只是锁了这个用户的
这行数据,只对他自己有影响,这个时候如果有个顾客C也买了电影
票,那么这个时候的冲突就是操作2了,因为人家也需要更新影院的
账户余额,所以我们要把操作2放在最后执行,因为这样对操作2涉及的
行锁,锁住时间就会少一点,最大程度的减少了事务之间的等待
提升了并发度。
死锁和死锁检测
如图所示,事务A在等待事务B释放id=2的锁,事务B在等待事务A释放id=1的锁
这种情况就是死锁
发生死锁有两种方法解决
1.直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置
2.发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以执行。
将参数innodb_deadlock_detect设置为on,表示开启这个逻辑
在innodb中,innodb_lock_wait_timeout的值默认是50s,以为着如果使用第一种方法,
第一个被锁住的线程要过50s才会超时退出,然后其他线程才有可能继续执行。
对于在线服务来说,这个等待时间往往是无法接受的。
但是我们又不能把这个时间设置的很小,比如1s,如果这个时候不是死锁,而是正常的锁等待呢
这样就会造成很多误伤,所以我们还是使用死锁检测好一些,好在innodb_deadlock_detect默认就是on
其实死锁检测也是会占用很多cpu资源的,当事务被锁住的时候,就要看看它锁依赖的线程有没有被别人锁住
如此循环,最后判断是否出现了循环等待,也就是死锁
了解更多:https://www.toutiao.com/c/user/83293539887/#mid=1633933053814798
mysql行锁和死锁检测的更多相关文章
- mysql行锁和表锁
mysql innodb支持行锁和表锁,但是MyIsam只支持表锁.现在我们说说mysql innodb的行锁和 有如下表id为主键 为了出现演示效果,我们将mysql的autocommit设置为0 ...
- mysql行锁、表锁。乐观锁,悲观锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
- MySQL 行锁 表锁机制
MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁 ...
- 理解 mysql行锁和表锁
在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索. innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Ses ...
- 【问答分享第一弹】MySQL锁总结:MySQL行锁、表锁、排他锁、共享锁的特点
大家好,我是小于哥哈.前几天能分享了第一期面试题,MySQL 中有哪几种锁 和 这些锁各有哪些特点 ,这道面试题是经常会被问到的一个面试题,大家反馈的都挺不错的.今天特此来总结一下. 首发于公众号[终 ...
- 数据库进阶之路(五) - MySQL行锁深入研究
由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: ; --如果restnum大于0,执行u ...
- MySQL行锁深入研究
原文:http://blog.csdn.net/minipeach/article/details/5325161/ 做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图 ...
- mysql 行锁
在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. 我们都知道for update实际上是共享锁 ...
- Mysql 行锁 for update
Mysql 只有Innodb支持行锁 使用行锁需要 事务支持 首先打开两个 mysql-client 分别执行 - client1 select * from my_entity1 for updat ...
随机推荐
- 干货!小白入门Python数据科学全教程
前言 本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据 ...
- 搜索---BFS
搜索 深度优先搜索和广度优先搜索广泛的应用于树和图中,但是他们的应用远不止于此. BFS 广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点 ...
- 2019-3-6-WPF-使用-SharpDX
title author date CreateTime categories WPF 使用 SharpDX lindexi 2019-03-06 16:52:37 +0800 2018-4-20 9 ...
- 2018-8-28-win10-uwp-MVVM入门
title author date CreateTime categories win10 uwp MVVM入门 lindexi 2018-08-28 15:37:52 +0800 2018-2-13 ...
- linux基础知识(三)
添加用户 •useradd -d 家目录 -g 组名 -G 组集合(逗号间隔) -p 密码 -s 用户shell程序 用户名 •useradd -d /usr/local/nginx/ -g ngin ...
- 解析 Java 反射题中一个有趣的坑
public class Test { public void age(int age) { System.out.println("int age="+age); } publi ...
- django之路由的理解
一:路由 简单的路由过程图: 1. 路由的定义位置 路由定义方式一:主路由和子路由分开定义 主路由的定义 urls.py from django.conf.urls import url from d ...
- 在vue项目中,解决如何在element表格中循环出图片列!
效果图: 1,vue项目环境 2,引入element-ui组件 3,制作表格 此处省去制作循环表格数据那步,想看的可以找回我的博客:element中的表格处理:循环出表格数据 今天想在表格出循环出一列 ...
- 谷歌浏览器 安装 Vue.js devtools 工具
如果是vue写的项目,谷歌浏览器右上角的vue小图标会亮起!下面介绍如何安装 1.谷歌浏览器插件商店可以点击安装[需要梯子] 2.vue官网有对应的安装包,需要自己手动 npm run build 一 ...
- linux运维、架构之路-linux用户管理
一. linux系统用户分类 1.分类 ①超级用户:root,UID为0 ②普通用户:UID是500-65535的用户 ③虚拟用户:UID在1-499,一般不能登录,满足文件或服务启动的需要,/sbi ...