2009-06-01 72 views
1
DB Table: 
id  int(6) 
message char(5) 

我必須添加一條記錄(消息)到數據庫表。如果重複的消息(此消息已經存在,使用不同的ID)我想刪除(或不知何故)兩種消息,並得到他們的ID的答覆。插入/刪除性能

只有一個查詢可以執行嗎?任何性能提示?...

P.S. 我使用PostgreSQL。

主要我的問題,我擔心,需要兩個或多個查詢執行這個時候使用鎖...

非常感謝!

+0

其中RDBMS? .... – 2009-06-01 12:22:36

回答

2

如果您確實想擔心鎖定,請執行此操作。

  1. UPDATE table SET status ='INACTIVE'WHERE id ='key';

    如果成功,則有重複。

    • 插入額外的非活動記錄。做任何你想要的與你的副本。

    如果失敗,則沒有重複。

    • 插入新的活動記錄。
  2. 提交。

這就奪取了一個獨家鎖定馬上。替代品不太好。

  • 以INSERT開頭並檢查重複項是否在開始更新之前沒有佔用鎖。目前還不清楚這是否有問題。

  • 以SELECT開始將需要添加一個鎖定表以確保所選內容保留找到的行,以便可以更新。如果沒有找到行,插入將工作正常。

如果你有多個併發作家和兩位編劇可以嘗試在同一時間訪問,你可能不能夠容忍行級鎖。

請考慮這一點。

  1. 進程A執行LOCK ROW和SELECT,但未找到任何行。

  2. 進程B執行LOCK ROW和SELECT,但未找到任何行。

  3. 進程A執行INSERT和COMMIT。

  4. 過程B執行INSERT和COMMIT。您現在有重複的活動記錄。

的多個併發插入/更新交易將只處理表級鎖的工作。是的,這是一個潛在的放緩。三條規則:(1)儘可能縮短交易時間;(2)儘快釋放鎖;(3)通過重試來處理死鎖。

+0

我只是覺得第一個查詢應執行該什麼時候使用鎖: UPDATE表SET狀態=「無效」 WHERE message ='New_message'AND status ='ACTIVE'; – Savash 2009-06-02 07:27:15

1

您可以編寫一個包含這兩個命令的過程,但使用插入觸發器檢查重複項(或夜間作業,如果不是時間敏感的)可能更有意義。

0

這是有點難以理解你的確切要求。讓我重組你的方法有兩種:

  1. 你想同時在表中相同信息的條目(不同的ID),並想知道一些進一步的處理的ID(其標記爲不活動等) 。爲此,您可以使用單獨的查詢編寫過程。我不認爲你可以通過一個查詢來實現這一點。

  2. 你不想要表中的任何一個條目(我從'我想刪除'這個)。爲此,您只需檢查消息是否已經存在,然後刪除該行,否則插入它。我不認爲這可以通過一個查詢來實現。

如果性能是插入過程中的一個約束,那麼可以插入而不進行任何檢查,然後定期清理數據庫。

+0

主要我的問題,我擔心,需要兩個或多個查詢... – Savash 2009-06-01 13:32:00