java - Mysql如何保证主键自增是线程安全的?

标签 java mysql

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

Mysql如何保证两个主键id不同的事务顺利插入?

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

最佳答案

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

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

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

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

关于java - Mysql如何保证主键自增是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55783827/

相关文章:

java - 具有共享数据库的单体到微服务

java - 与 Runnable JAR 共享 JDBC 连接

java - PMD:如何仅忽略 lambda 表达式中的短变量名

java - 包装 byte[] 的 ImageInputStreamImpl 实现

java - 查找输入数组的最大值

php - 如何使用php格式化数据库中的日期

php - 如何从jquery表中插入多个表单数据到数据库

php - 如何使用bootstrap制作动态时间线?

Java/MySQL - 在 ResultSet 上进行选择

php - 无法使用sql删除表中的数据