【问题标题】:How can Mysql ensure that the primary key self-increasing is thread-safe?Mysql如何保证主键自增是线程安全的?
【发布时间】:2019-09-11 00:32:06
【问题描述】:

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

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

如果可以的话,希望能解答一下insert语句的执行过程,包括插入有意锁,保证主键ID不冲突,insert完成后持有什么锁。

【问题讨论】:

  • 似乎是 this question 的副本。对于 MyISAM,无论哪个线程先到达,整个表都会被锁定。对于 InnoDB,该行将被锁定。
  • @TimBiegeleisen,InnoDB 不使用行锁来增加表的 auto-inc 值。它使用一种特殊类型的表锁。
  • @Bill Karwin 可以指定流程吗?

标签: java mysql


【解决方案1】:

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

这是一个持续时间非常短暂的锁,仅足以增加表的自动增量值。然后释放锁,允许另一个线程以线程安全的方式做同样的事情。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多