MySQL——锁

简介

多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁

锁的分类

Mysql中的锁机制基本上都是采用的悲观锁来实现的。

行锁

行锁就是一锁锁一行或者多行记录,mysql的行锁是基于索引加载的,所以行锁是要加在索引响应的行上,即命中索引

行锁的特征:锁冲突概率低,并发性高,但是会有死锁的情况出现。

表锁

表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作。表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划看出扫描了多少条记录。

读锁

READ:当前会话和其它会话都可以读表,但是不能修改表

写锁

WRITE:当前会话可以读写表,但是其它会话既不能读也不能写

共享锁

其他事务可以读取数据,但不能对该数据进行修改,直到所有的共享锁被释放。 如果事务对某行数据加上共享锁之后,可进行读写操作;其他事务可以对该数据加共享锁,但不能加排他锁,且只能读数据,不能修改数据 。

排他锁

如果事务对数据加上排他锁之后,则其他事务不能对该数据加任何的锁。 获取排他锁的事务既能读取数据,也能修改数据 。

乐观锁与悲观锁

悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁

那相反的,如果多线程同时修改共享资源的概率比较低,就可以采用乐观锁。

乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作

活锁

在竞争资源的时候,一直得不到,活活被锁住,一直等待

死锁

死锁: 在竞争资源的时候,必须满足2个条件,多个进程同时访问,A进程获得了1个条件,B进程获得了第2个条件,A和B都没有同时满足2个条件,互相又都不释放已经掌握的条件,导致2个进程僵死,都不能访问。

如何避免死锁?

1.设计流程,必须先拿到第1个条件,然后才可以去拿第2个条件

2.设计一个单独的进程,去检查是否发生死锁,如果发生了,根据一个算法,权衡利弊,考虑杀死一个进程,释放资源。

总结

相关推荐
吴声子夜歌2 分钟前
Java面试——数据结构(一)
java·数据结构·面试
罗超驿2 分钟前
SpringBoot 快速入门
java·spring boot·后端
Wang's Blog6 分钟前
PostgreSQL笔记59:行列级权限机制与数据脱敏实践
数据库·笔记·postgresql
'20626 分钟前
**写了个自动整理下载视频的脚本:按片名归档、自动重命名、生成目录索引
开发语言·python·ffmpeg·音视频·cctv
疯狂打码的少年28 分钟前
【数据结构】选择类排序:简单选择与堆排序
java·数据结构·笔记·算法
xys_67830 分钟前
深挖C语言:动态内存管理
c语言·开发语言
OPEN-F1 小时前
Python进阶教程:项目工程化与虚拟环境
开发语言·python
吴声子夜歌1 小时前
Java面试——基础
java·开发语言·面试
智码看视界1 小时前
Day 56:AI辅助开发全面提效:Copilot + Cursor的Java开发
java·单元测试·copilot·cursor·后端开发·代码审查·ai辅助开发
tachibana21 小时前
把RAGAS跑起来
数据库·人工智能·ai·架构·大模型·llm·rag