MySQL 在插入失敗時的自動增量行為
MySQL 的唯一索引透過防止重複條目來強制資料完整性。但是,當由於唯一按鍵違規而導致插入失敗時,會出現意想不到的後果:儘管插入失敗,自動增量值仍會遞增。
瞭解 InnoDB 的事務性
MySQL 的 InnoDB 儲存引擎以交易方式運作。在事務中,多個操作以原子方式執行,確保所有操作要么全部成功,要么全部失敗。
自動增量鎖定機制
與其他事務方面不同,它會一直保留到最後交易的自增計數器使用特殊的表級鎖定。此鎖在目前 SQL 語句結束時釋放,而不是在交易結束時釋放。
這種設計允許增加插入操作的並發性。透過僅短暫持有鎖定,多個會話可以同時將記錄插入不同的行,同時保持唯一值。
潛在後果
雖然避免自動增量值中的間隙似乎是可取的,InnoDB 透過允許間隙來優先考慮並發性。因此,惡意行為者可能會以失敗的插入請求淹沒表,導致自動增量值快速增加。
緩解策略
要緩解此漏洞,請考慮使用自動增量欄位的BIGINT(8 位元組)資料類型,在潛在的迴繞發生之前提供更大範圍的值。
以上是為什麼MySQL在插入失敗後繼續自動增量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!