一文学习MySQL 意向共享锁、意向排他锁、死锁

yizhihongxing

一文学习MySQL 意向共享锁、意向排他锁、死锁

基本概念

在MySQL中,锁分为共享锁和排他锁。通过给表或行加锁,可以控制并发访问,保证数据的一致性。但在实际中,使用锁的时候需要考虑多个事务的锁的申请与释放顺序,否则会导致死锁。

MySQL还引入了意向锁的概念。在行级别加锁之前,通过意向锁标记表上接下来需要加的锁类型,以便它能和其他请求的锁协调。在MySQL中,意向锁分为意向共享锁和意向排他锁,它们可以表示事务将要加的锁类型。

意向共享锁和意向排他锁

意向锁标记的是接下来需要加的锁的类型,它并不是真正的锁,而是一种通知。当一段事务想要上锁时,会首先在对象上面请求相应类型的意向锁。

意向锁是一个或多个事务加的锁的通知,以表明它对下一个需要加相应类型的锁有兴趣。因此,在任何时刻只能有唯一一个排他锁,或者同时存在多个共享锁,这些锁都能请求相同的意向锁。

死锁

当发生死锁时,两个或多个事务在等待尚未释放的锁。这些事务不能继续,因此形成了一个循环依赖的状态。这种情况下存在两个或多个事务,每个事务都在等待对方释放锁,而这些事务都不能继续向前推进。

为了避免死锁,应该尽量避免长时间持有锁,尽快释放锁。另外,可以通过规避循环依赖,避免形成死锁。

示例说明

下面通过两个示例来说明意向锁的使用和死锁的产生。

示例一

假设有两个事务T1和T2,T1先进行SELECT操作,请求共享锁并获取,T2接着进行SELECT操作,也请求共享锁,可以发现遵循了意向锁机制。但T1接着进行UPDATE操作,需要改为排他锁,此时会请求意向排他锁,因为此时有意向共享锁存在,所以只能加意向排他锁。T2如果此时也想进行UPDATE操作,会先请求意向排他锁,在检查到意向排他锁存在的情况下,会等待T1事务的排他锁释放。

-- T1
START TRANSACTION;
SELECT * FROM t WHERE id = 1 LOCK IN SHARE MODE;
UPDATE t SET name = 'test' WHERE id = 1;
COMMIT;

-- T2
START TRANSACTION;
SELECT * FROM t WHERE id = 1 LOCK IN SHARE MODE;
-- 排队等待锁

-- T1释放锁后,T2继续执行
UPDATE t SET name = 'test' WHERE id = 1;
COMMIT;

示例二

假设有两个事务T1和T2,在不同的表上进行SELECT和UPDATE操作。在T1事务进行SELECT加共享锁后,T2检查另一个表中没有意向共享锁,于是继续向下执行。但T1事务接着进行UPDATE操作时,需要上排他锁,此时产生了死锁,因为T2事务已经拥有表上行的共享锁,在T1释放行上锁之前,两个事务就会一直等待下去。

-- T1
START TRANSACTION;
SELECT * FROM t1 WHERE id = 1 LOCK IN SHARE MODE;
UPDATE t2 SET name = 'test' WHERE id = 1;
COMMIT;

-- T2
START TRANSACTION;
SELECT * FROM t2 WHERE id = 1 LOCK IN SHARE MODE;
-- 检查到没有意向共享锁
-- 接着向下执行,查询t1
SELECT * FROM t1 WHERE id = 1;
-- 接着上共享锁
SELECT * FROM t1 WHERE id = 2 LOCK IN SHARE MODE;
-- 死锁

在遇到死锁时,MySQL会根据一定的机制自动选择一个事务进行回滚,回到请求的地方重新执行。但一般来说,调整事务的执行顺序还是降低死锁产生的一个可行方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文学习MySQL 意向共享锁、意向排他锁、死锁 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 关于MySQL中的 like操作符详情

    当我们需要对数据库表中的某一列进行模糊匹配查询时,MySQL提供了LIKE操作符。 LIKE操作符是用来匹配字符串的,它和通配符结合使用可以实现对表中字符串的模糊查询。 以下是LIKE操作符的使用语法: SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; 其中,colum…

    database 2023年5月22日
    00
  • Neo4j和CouchDB的区别

    Neo4j和CouchDB都是NoSQL数据库,但它们的设计理念和适用场景不同。 Neo4j 设计理念 Neo4j是一个图形数据库,它的设计理念是将数据表示为节点和关系。每个节点代表实体,每个关系代表节点之间的联系。这种方式使得查询任意两个实体之间的关系非常高效,因为查询只需要在关系图中跟踪节点和关系就可以了。 适用场景 Neo4j非常适用于需要处理丰富而复…

    database 2023年3月27日
    00
  • 使用Redis实现抢购的一种思路(list队列实现)

    原文:https://my.oschina.net/chinaxy/blog/1829233   抢购是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少(“超卖”问题) 对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。重点在于第二个问题,我们看看下…

    Redis 2023年4月11日
    00
  • 解决mysql数据库设置远程连接权限执行grant all privileges on *.* to ‘root’@’%’ identified by ‘密码’ with grant optio报错

    这个问题可能是由于MySQL数据库服务器没有设置允许来自远程主机的连接,或者没有正确设置用户名和密码所致。为了解决这个问题,我们可以采取以下步骤: 修改MySQL数据库配置文件 首先需要修改MySQL数据库的配置文件 my.cnf,打开终端并输入以下命令查看文件是否存在: $ sudo ls -ahl /etc/mysql/my.cnf 如果文件不存在,可以…

    database 2023年5月18日
    00
  • 得物基于StarRocks的OLAP需求实践详解

    下面是“得物基于StarRocks的OLAP需求实践详解”的完整攻略。 1. 背景 得物是中国领先的社交电商平台之一,数据量非常庞大。在应对这么庞大的数据量时,OLAP技术实现数据查询和分析是一个非常重要的手段。 当然,得物不是一个小公司,他们需要的不仅仅是一个“普通的”OLAP系统,还需要具备可扩展性、高效性和易用性。为此,他们采用了由StarRocks公…

    database 2023年5月18日
    00
  • 安装Oracle10g遭遇ins_ctx.mk问题解决方法

    关于“安装Oracle 10g遭遇ins_ctx.mk问题解决方法”的完整攻略,以下是详细的步骤说明: 1. 确认问题和环境 首先,我们需要确认安装Oracle 10g时遇到的ins_ctx.mk问题。 可以在安装过程中,在出现问题的提示时,仔细阅读提示信息,确保报错的信息是类似“ins_ctx.mk”这样的问题。 另外,也需要检查安装环境是否满足Oracl…

    database 2023年5月21日
    00
  • MySQL 5.7常见数据类型

    MySQL 5.7支持多种不同的数据类型,包括数值、日期/时间、字符串、JSON等类型。在本文中,我们将详细讲解MySQL 5.7常见的数据类型,包括每种类型的特点、用法以及示例说明。 数值类型 MySQL 5.7支持多个数值类型,包括整型、浮点型、定点型等。 整型 我们常用的整型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。…

    database 2023年5月22日
    00
  • 讲解Linux系统下如何自动备份MySQL数据的基本教程

    请注意,实现自动备份MySQL数据有多种方法,本篇攻略将介绍两种不同的方案,并给出详细的步骤和示例说明。方案一是使用Linux自带的crontab命令定时执行备份脚本,方案二则是使用第三方工具mysqldump实现自动备份。 方案一:使用crontab命令备份MySQL数据 1. 准备备份脚本 首先,我们需要编写一个备份脚本,以便在定时任务执行时自动备份My…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部