在壓力下確保 SQL 資料庫中的唯一行插入
SQL 開發人員面臨的一個常見挑戰是插入行而不建立重複項。 傳統方法經常涉及子查詢:
<code class="language-sql">INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WHERE PrimaryKey = @primaryKey)</code>
但是,在重負載下,這種方法可能會導致主鍵違規,從而損害語句原子性。
為了緩解這種情況,一些開發人員採用了鎖定機制:
<code class="language-sql">INSERT INTO TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) WHERE PrimaryKey = @primaryKey)</code>
但是過多的鎖定會顯著影響效能。
一種更有效率的策略,通常稱為「JFDI」(Just F***ing Do It)方法,涉及直接插入和錯誤處理:
<code class="language-sql">BEGIN TRY INSERT etc END TRY BEGIN CATCH IF ERROR_NUMBER() <> 2627 RAISERROR etc END CATCH</code>
這避免了巢狀查詢和鎖定,從而提高了大容量下的並發性。
至關重要的是,正確的索引至關重要。 正如經驗豐富的 SQL 開發人員在「第 4 課」中所強調的那樣,僅依靠子查詢來防止重複是不可靠的。 唯一的索引加上適當的錯誤處理(例如捕獲錯誤 2627),可提供自動重複預防,從而簡化流程。
以上是SQL開發人員如何確保高負載下唯一的行插入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!