MySQL innodb select 用于更新并发

标签 mysql locking innodb

MySQL documentation说 SELECT FOR UPDATE 设置了 IX 锁。 IX 锁是意向排他锁,发出时意味着“事务 T 打算在扫描的行上设置 X(排他)锁”。这意味着在 SELECT FOR UPDATE 成功之前,它必须首先获取 IX,然后获取 X。MySQL 术语表中关于意向独占锁的说明如下:

intention lock

A kind of lock that applies to the table level, used to indicate what kind of lock the transaction intends to acquire on rows in the table. Different transactions can acquire different kinds of intention locks on the same table, but the first transaction to acquire an intention exclusive (IX) lock on a table prevents other transactions from acquiring any S or X locks on the table. Conversely, the first transaction to acquire an intention shared (IS) lock on a table prevents other transactions from acquiring any X locks on the table. The two-phase process allows the lock requests to be resolved in order, without blocking locks and corresponding operations that are compatible. For more details on this locking mechanism, see Section 14.3.5.3, “InnoDB Lock Modes”.

此外,IX 和 IX 是兼容的(锁类型兼容性矩阵),这意味着如果事务 1 发出 IX,并且紧接着另一个并发事务发出 IX,它将成功。

是否有可能在完全相同的时刻发出两个并发 IX,并且 MySQL 为同一个表的两个事务授予/获取 IX。或者,如果发出并发 IX,则 MySQL 在任何时候仅授予一个 IX。我认为 MySQL 只授予其中之一,即使调用是在 MySQL 端同时进行和触发的。

编辑:基本上,如果我概括我的问题:如果两个(并发)锁定行的sql语句(例如更新、选择更新、选择共享模式下的锁定、插入、删除)同时到达MySQL,我假设 MySQL 按顺序处理它们。只是想确保我正确地思考了 MySQL 内部的工作原理。

最佳答案

锁定操作必然是串行的。在服务器逻辑工作流程的纳秒级别,不存在“同一时刻的多个锁定请求”之类的情况。即使有,服务器的逻辑也会任意将它们按某种顺序排列,并一个接一个地授予它们。

真正智能的下一代大规模并行服务器可能能够弄清楚不同的锁定请求保证永远不会相互干扰,并真正并行地处理它们。但就目前而言,还没有“同时”这样的东西。

关于MySQL innodb select 用于更新并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068335/

相关文章:

c# - 这个锁使用线程安全吗?

php - MySQL 查询在 OPTIMIZE TABLE 后返回不同的行(来自 PHP)

基于MySQL查询输出的PHP决策

c# - 有什么方法可以确定在 C# 中等待锁定的线程数?

java - 使用 JSP 减少数据库中的值时遇到问题

sql-server - 长时间锁定记录是现代数据库系统的常见做法吗?

mysql - 了解 mysql 字符集和排序规则

mysql - CREATE TABLE 不适用于 InnoDB,但适用于 MyISAM

php - 如何在CodeIgniter中执行mysql_data_seek?

MySQL - 在 CASE 中组合多个 WHEN 条件