MySQL-为什么一次插入锁定第二次插入?
我想在非主键字段中插入具有唯一值的行。我不能使用唯一索引,因为多字段索引中有空值,但在这里它并不重要 我使用插入/选择不存在的位置作为原子操作-见下文 我将在简化的示例中描述问题: 我有一张空桌子: 创建表测试 Id int11非空自动增量, int11默认值为NULL, 主键Id 引擎=InnoDB 。。。和关闭自动提交模式的2个会话: 在第一个会话中,我执行: 插入测试A 从“选择1”中选择一个作为客栈 如果不存在,则从A=1的测试中选择一个进行更新 在第二个会话中,我执行: 插入测试A 从“选择2”中选择一个作为客栈 如果不存在,则从A=2的测试中选择一个进行更新 如您所见,我正在插入独立的值。但第二个会话被第一个会话锁定。为什么?可能是因为gap/next钥匙锁 否则,我如何插入手动避免重复密钥且不相互锁定的记录MySQL-为什么一次插入锁定第二次插入?,mysql,locking,deadlock,Mysql,Locking,Deadlock,我想在非主键字段中插入具有唯一值的行。我不能使用唯一索引,因为多字段索引中有空值,但在这里它并不重要 我使用插入/选择不存在的位置作为原子操作-见下文 我将在简化的示例中描述问题: 我有一张空桌子: 创建表测试 Id int11非空自动增量, int11默认值为NULL, 主键Id 引擎=InnoDB 。。。和关闭自动提交模式的2个会话: 在第一个会话中,我执行: 插入测试A 从“选择1”中选择一个作为客栈 如果不存在,则从A=1的测试中选择一个进行更新 在第二个会话中,我执行: 插入测试A 从
默认事务隔离级别是可重复读取的,我不想更改数据库的默认设置,因为其他应用程序使用它。关于SELECT for UDPATE的间隙锁定,有具有唯一索引的锁、具有非唯一索引的间隙锁和不带索引的表锁: 此外,InnoDB在使用auto_increment保留密钥序列时会放置锁,这在复制过程中非常重要 这是我的重点: 当访问自动递增计数器时,InnoDB使用特殊的 表级AUTO-INC锁,它保留到当前SQL语句的末尾 语句,而不是事务的结尾。专用锁释放装置 引入了一种策略来提高插入到 包含自动增量列的表。然而,有两个 事务不能在同一个表上具有AUTO-INC锁 同时,如果AUTO-INC 锁被锁了很长时间。这可能是一个声明的情况 例如插入到t1。。。选择从t2插入所有行 从一张桌子到另一张桌子 MySQL v5.1.22中有一些性能改进,可能使用了更快的方法,但语句之间仍有一些等待 但是,如果不使用复制,可以通过允许交错的自动增量值来提高性能,从而提高并发性能: innodb_autoinc_锁定模式=2“交错”锁定模式
这似乎是一种非常复杂的插入忽略方式。这种方法的原因是什么?因为我可以在一些唯一的索引列中使用空值。你知道我还能如何插入唯一值吗?