MySQL——锁

简介

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

锁的分类

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

行锁

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

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

表锁

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

读锁

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

写锁

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

共享锁

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

排他锁

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

乐观锁与悲观锁

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

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

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

活锁

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

死锁

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

如何避免死锁?

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

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

总结

相关推荐
无风听海几秒前
OAuth 2.0 response_type完全指南
java·开发语言·oauth
Cyan_RA9几秒前
SpringMVC 数据格式化处理 详解
java·开发语言·spring·mvc·ssm·springmvc·数据格式化
2303_821287381 分钟前
怎么在MongoDB中追踪一个Document的具体流转路径_从Chunk分布到迁移历史日志分析
jvm·数据库·python
测试员周周2 分钟前
【Appium 系列】第08节-pytest 集成 — conftest.py 中的 fixture 与 hook
开发语言·人工智能·python·功能测试·appium·测试用例·pytest
SunnyDays10113 分钟前
Java 实现 PDF 中文文本查找与高亮的四种方法
java·pdf·查找文字
倒流时光三十年5 分钟前
PostgreSQL 一次由 string_agg 引发的数据错位 Bug 深度复盘
java·postgresql·string_agg
Hui_AI7205 分钟前
电商桌面自动化实战:用RPA实现抖店批量铺货
运维·开发语言·人工智能·自然语言处理·自动化·开源软件·rpa
重生之小比特5 分钟前
【MySQL 数据库】视图
数据库·mysql
weixin_459753946 分钟前
mysql如何批量重置数据库用户密码_MySQL批量修改密码Shell脚本
jvm·数据库·python
人道领域6 分钟前
【LeetCode刷题日记】递归与回溯实战 257.二叉树的所有路径——一篇文章彻底搞懂回溯
开发语言·python·算法·leetcode