SELECT
或INSERT
操作是否容易出現競爭條件? 在您的PL/pgSQL函數中,您將資料插入Posts
表,並循環遍歷標籤以將其插入Tags
和Taggings
表。您擔心當多個用戶同時嘗試刪除標籤和建立貼文時,此過程可能會遇到競爭條件。
在並發寫入負載下,「SELECT
或INSERT
」的概念出現在嘗試將新行插入表中,但又希望在該行已存在時檢索它時。在SQL中,可以使用INSERT ... ON CONFLICT ... DO SOMETHING
語句來實現這一點。
您的函數在將標籤插入Tags
表時使用了此技術,但是如果另一個事務在您的事務提交之前刪除了相關的標籤,則可能會遇到競爭條件。為防止這種情況,請考慮以下技術:
SELECT
語句中,使用FOR SHARE
鎖定現有行,確保其他交易在您的交易進行時無法修改它們。 LIMIT
的UNION ALL
: 使用UNION ALL
查詢組合SELECT
和INSERT
語句,在結果上使用LIMIT 1
子句。如果行已存在或插入成功,此技術允許快速退出。 INSERT
函數: 將插入操作外包到單獨的函數中。此函數應處理任何必要的異常處理,而主函數則專注於整體邏輯。 透過實作這些方法之一,您可以防止函數中的競爭條件,並確保資料庫中的資料完整性。
以上是PL/pgSQL 中並發的「SELECT」和「INSERT」操作會導致競爭條件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!