Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-为什么一次插入锁定第二次插入?_Mysql_Locking_Deadlock - Fatal编程技术网

MySQL-为什么一次插入锁定第二次插入?

MySQL-为什么一次插入锁定第二次插入?,mysql,locking,deadlock,Mysql,Locking,Deadlock,我想在非主键字段中插入具有唯一值的行。我不能使用唯一索引,因为多字段索引中有空值,但在这里它并不重要 我使用插入/选择不存在的位置作为原子操作-见下文 我将在简化的示例中描述问题: 我有一张空桌子: 创建表测试 Id int11非空自动增量, int11默认值为NULL, 主键Id 引擎=InnoDB 。。。和关闭自动提交模式的2个会话: 在第一个会话中,我执行: 插入测试A 从“选择1”中选择一个作为客栈 如果不存在,则从A=1的测试中选择一个进行更新 在第二个会话中,我执行: 插入测试A 从

我想在非主键字段中插入具有唯一值的行。我不能使用唯一索引,因为多字段索引中有空值,但在这里它并不重要

我使用插入/选择不存在的位置作为原子操作-见下文

我将在简化的示例中描述问题:

我有一张空桌子:

创建表测试 Id int11非空自动增量, int11默认值为NULL, 主键Id 引擎=InnoDB

。。。和关闭自动提交模式的2个会话:

在第一个会话中,我执行:

插入测试A 从“选择1”中选择一个作为客栈 如果不存在,则从A=1的测试中选择一个进行更新

在第二个会话中,我执行:

插入测试A 从“选择2”中选择一个作为客栈 如果不存在,则从A=2的测试中选择一个进行更新

如您所见,我正在插入独立的值。但第二个会话被第一个会话锁定。为什么?可能是因为gap/next钥匙锁

否则,我如何插入手动避免重复密钥且不相互锁定的记录


默认事务隔离级别是可重复读取的,我不想更改数据库的默认设置,因为其他应用程序使用它。

关于SELECT for UDPATE的间隙锁定,有具有唯一索引的锁、具有非唯一索引的间隙锁和不带索引的表锁:

此外,InnoDB在使用auto_increment保留密钥序列时会放置锁,这在复制过程中非常重要

这是我的重点:

当访问自动递增计数器时,InnoDB使用特殊的 表级AUTO-INC锁,它保留到当前SQL语句的末尾 语句,而不是事务的结尾。专用锁释放装置 引入了一种策略来提高插入到 包含自动增量列的表。然而,有两个 事务不能在同一个表上具有AUTO-INC锁 同时,如果AUTO-INC 锁被锁了很长时间。这可能是一个声明的情况 例如插入到t1。。。选择从t2插入所有行 从一张桌子到另一张桌子

MySQL v5.1.22中有一些性能改进,可能使用了更快的方法,但语句之间仍有一些等待

但是,如果不使用复制,可以通过允许交错的自动增量值来提高性能,从而提高并发性能:

innodb_autoinc_锁定模式=2“交错”锁定模式


这似乎是一种非常复杂的插入忽略方式。这种方法的原因是什么?因为我可以在一些唯一的索引列中使用空值。你知道我还能如何插入唯一值吗?