MySQL——锁

简介

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

锁的分类

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

行锁

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

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

表锁

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

读锁

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

写锁

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

共享锁

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

排他锁

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

乐观锁与悲观锁

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

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

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

活锁

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

死锁

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

如何避免死锁?

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

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

总结

相关推荐
float_六七几秒前
IntelliJ IDEA断点调试全攻略
java·ide·intellij-idea
Tiger_shl2 分钟前
【.Net技术栈梳理】02-核心框架与运行时(GC管理)
开发语言·.net
渣哥7 分钟前
面试官最爱追问:多线程到底用来干什么?
java
阿里matlab建模师8 分钟前
【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
开发语言·数学建模·matlab·全国大学生数学建模竞赛·美赛·科研项目
七夜zippoe10 分钟前
分布式事务性能优化:从故障现场到方案落地的实战手记(一)
java·分布式·性能优化
MediaTea17 分钟前
Python 第三方库:SymPy(符号计算工具)
开发语言·python·数学建模
qq_3564086617 分钟前
es通过分片迁移迁移解决磁盘不均匀问题
java·数据库·elasticsearch
他们都不看好你,偏偏你最不争气25 分钟前
【iOS】UIViewController
开发语言·macos·ios·objective-c·cocoa
青衫码上行34 分钟前
【从0开始学习Java | 第17篇】集合(中-Set部分)
java·学习
Pocker_Spades_A36 分钟前
Python快速入门专业版(二十二):if语句进阶:嵌套if与条件表达式(简洁写法技巧)
开发语言·python