MySQL——锁

简介

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

锁的分类

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

行锁

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

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

表锁

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

读锁

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

写锁

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

共享锁

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

排他锁

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

乐观锁与悲观锁

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

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

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

活锁

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

死锁

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

如何避免死锁?

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

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

总结

相关推荐
渣哥2 分钟前
Java开发必看!序列化与反序列化到底有多重要?
java
郝学胜-神的一滴2 分钟前
使用C++11改进工厂方法模式:支持运行时配置的增强实现
开发语言·c++·程序人生·设计模式
仙俊红6 分钟前
使用jwt+redis实现单点登录
java
我是场9 分钟前
Android14内核调试 - boot & vendor_boot
java·开发语言·spring boot
爱和冰阔落10 分钟前
从关机小游戏学 C 语言:分支循环 + 关键字(break/continue)实战
c语言·开发语言
Korloa22 分钟前
表达式(CSP-J 2021-Expr)题目详解
c语言·开发语言·数据结构·c++·算法·蓝桥杯·个人开发
fake_ss19824 分钟前
从零开发Java坦克大战Ⅱ (下)-- 从单机到联机(完整架构功能实现)
java·网络·tcp/ip·游戏程序
AI 嗯啦33 分钟前
SQL详细语法教程(七)核心优化
数据库·人工智能·sql
lssjzmn38 分钟前
java中,synchronized 关键字与 ReentrantLock 重入锁的区别以及应用场景,注意事项
java·后端
渣哥40 分钟前
Spring循环依赖的终极解密:三级缓存如何拯救Bean创建死锁
java