Mysql的共享锁(S 锁)排他锁(X 锁)死锁的产生与解决办法

news/2024/10/23 5:39:03/

表级锁

MySQL表级锁分为读锁和写锁。

读锁

用法:LOCK TABLE table_name [ AS alias_name ] READ

释放锁使用UNLOCK tables.可以为表使用别名,如果一旦使用别名在使用的时候也必须采用别名。成功申请读锁的前提是当前没有线程对该表使用写锁,否则该语句会被阻塞。申请读锁成功后,其他线程也可以对该表进行读操作,但不允许有线程对其进行写操作,就算是当前线程也不允许。当锁住了A表之后,就只能对A表进行读操作,对其他表进行读操作会出现错误(tablename was not locked with LOCK TABLES)

user表中有一条数据记录:

travelrecord中有一条数据记录:

在锁定了tb_user表后,再去查询travelrecord表,此时的查询报错:

如果此时,在另外一个session中进行更新操作:

update tb_user set name = 'hand1' where id = 6

则一直处于阻塞状态:

写锁

用法: LOCK TABLE table_name [AS alias_name] [ LOW_PRIORITY ] WRITE

同样也可以使用别名,与读锁不同的是,写锁中可以指定锁的优先级。LOW_PRIORITY是一种比读锁更低优先级的锁,当多个线程同时申请多种锁(LOW_PRIORITY,READ,WRITE)时,LOW_PRIORITY的优先级最低。读锁申请成功的前提是没有线程对表加读锁和其他写锁,否则会被阻塞。

表级锁在MyISAM和innoDB中都有用到,创建锁的开销小,不会出现死锁,由于锁定的是整张表,所以并发度低。当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,推荐使用表级锁。

行级锁

行级锁是Mysql中锁定粒度最细的一种锁,能大大减少数据库操作的冲突,由于其粒度小,加锁的开销最大。行级锁分为共享锁和排他锁。

共享锁(S LOCK)

用法:SELECT ...LOCK IN SHARE MODE;

Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

排他锁(X LOCK)

用法:SELECT ...LOCK FOR UPDATE;

Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。

死锁

概念:

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.

产生条件:

  • 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放
  • 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放
  • 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放
  • 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源

遇到死锁可以执行如下的查询语句观察等待的事务:

-- 查看当前的事务
select * from information_schema.innodb_trx;
-- 查看当前锁定的事务
select * from information_schema.innodb_locks;
-- 查看当前等锁的事务
select * from information_schema.innodb_lock_waits;

也可以执行如下的查询将死锁的日志导出:

show engine innodb status


http://www.ppmy.cn/news/782947.html

相关文章

mysql 共享锁(读写锁) 修改数据问题(update,insert)(LOCK IN SHARE MODE)

个人测试发现,共享锁某些情况下也可以修改数据(因为我一直误以为,只要加了共享锁,即使只有一个,也不能修改,实际测试后结论:只有一个共享锁的话,当前持有这个共享锁的,可…

共享锁(Shared Lock)

共享锁(Shared Lock),又称S锁、读锁。针对行锁。 当有事务对数据加读锁后,其他事务只能对锁定的数据加读锁,不能加写锁(排他锁),所以其他事务只能读,不能写。 &#x1f…

C++学习第十八天(函数模板)

模板 1.1 模板的概念 模板就是 建立通用的模具,大大提高复用性,特点:模板不可以直接使用,他只是一个框架;模板的通用并不是万能的。 1.2 函数模板语法 函数模板的作用:建立一个通用函数,其函数返…

Unity3D之ForceMode模式

ForceMode是一种在物理引擎中使用的模式,用于模拟对象之间的力和运动。它常用于游戏开发、虚拟现实和机器人学等领域。 ForceMode通常应用于刚体(Rigidbody)对象,通过施加力来影响物体的运动。它提供了不同的模式,可以…

P8905 [USACO22DEC] Strongest Friendship Group G 题解

决定小团体强度的值有两个: 团体内的最小度。团体人数。 我们可以考虑枚举最小度求最大的团体人数。 我们发现小于原图最小度的度肯定不优,因为原图最小度可以直接选择包含全图使团体人数最大,这给了我们一个启发。 在之后,由…

【送书福利-第十四期】ChatGPT时代 + PowerBI助力快速创建动态报表

大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 本文目录 一、前言二、内容介绍三、抽奖方…

关于电脑连接蓝牙耳机出现的一些问题,以及解决方案

首先,会有找不到对应的蓝牙耳机设备,这时,就说明,你的蓝牙驱动不行,证明方法,网上有很多,自己查,重点是你需要重新下载蓝牙驱动,重点来了 “关掉无线”---“关掉无线”--…

Tkinter_鼠标选中样式

前言 使用tkinter库创建窗口应用程序示例,包含不同鼠标样式标签。 一、方法 import tkinter as tkclass Mouse_Style:def __init__(self):self.root tk.Tk()self.root.title(样式)self.root.geometry("200x5201100150")self.interface()def interface(…