与两个事务并发的inserts的行元组没有指定主键id,这是自增的Mysql如何确保两个事务顺利插入,具有不同的主键ID?如果可能的话,我希望能够回答insert语句的执行过程,包括插入有意的锁,确保主键ID不冲突,insert完成后持有哪些锁。
lyr7nygr1#
基本上与其他线程安全代码的工作方式相同:通过创建一个critical section of code,所以只有一个线程可以访问递增给定表的自动递增值,除非它首先获得一个特殊类型的表锁。这是一个持续时间非常短的锁,只足够增加表的自动增量值。然后释放锁,允许另一个线程以线程安全的方式执行相同的操作。锁也是针对每个表的,这与临界区代码的传统实现不同,临界区代码的传统实现通常在代码的特定部分周围使用全局互斥锁。InnoDB中有一些选项可以控制如何获取和释放表锁。你可能会喜欢https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
1条答案
按热度按时间lyr7nygr1#
基本上与其他线程安全代码的工作方式相同:通过创建一个critical section of code,所以只有一个线程可以访问递增给定表的自动递增值,除非它首先获得一个特殊类型的表锁。
这是一个持续时间非常短的锁,只足够增加表的自动增量值。然后释放锁,允许另一个线程以线程安全的方式执行相同的操作。
锁也是针对每个表的,这与临界区代码的传统实现不同,临界区代码的传统实现通常在代码的特定部分周围使用全局互斥锁。
InnoDB中有一些选项可以控制如何获取和释放表锁。你可能会喜欢https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html