Mysql如何确保主键自增是线程安全的?

时间:2019-04-21 14:56:24

标签: java mysql

与两个事务并发的插入行的元组未指定主键id,这是自增的

Mysql如何确保使用不同的主键ID顺利插入两个事务?

如果可能的话,我希望能够回答插入语句的执行过程,包括插入故意的锁,确保主键ID不冲突以及插入完成后将持有哪些锁。

1 个答案:

答案 0 :(得分:4)

与其他任何线程安全代码基本相同的工作方式:通过创建critical section of code,因此只有一个线程可以访问给定表的自动增量值,除非它首先获取一种特殊类型的表,否则最多可以访问该线程锁定。

这是一个持续很短的锁,只有足够长的时间才能增加表的自动增量值。然后释放该锁,允许另一个线程以线程安全的方式执行相同操作。

该锁也是按表锁定的,这与关键部分代码的传统实现不同,后者通常在代码的特定部分周围使用全局互斥锁。

有一些选项可以控制如何获取和释放InnoDB中的故事锁。您可能想阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html