2017-05-08 52 views
1

我有一個nodejs Web服務與MariaDB服務器和約500名日常活躍用戶在我的應用程序。MariaDB多個相同的行,即使使用REPEATABLE READ事務時

在我的代碼,我使用事務象下面這樣:

START TRANSACTION 

-- select to find out the existence of a row -- 
-- if the row doesn't exist, a new row inserted -- 

COMMIT 

本次交易應導致沒有插入重複行,但事實並非如此。
我認爲這發生在具有不同會話的2個請求同時到達時發現該行不存在,然後兩個會話都會插入它。

MariaDB事務隔離級別是REPEATABLE-READ。

這是因爲REPEATABLE READ隔離級別?

如何在另一個會話可能讀取同一行時獨佔地鎖定讀取和寫入?

回答

0

相反,執行下列操作之一,無論其是「原子」,並不需要圍繞它BEGIN/COMMIT除非有屬於同一事務的其他語句:

INSERT IGNORE ...; 

INSERT ... ON DUPLICATE KEY UPDATE ...; 

要解釋什麼是錯的我們的代碼:您應該在SELECT上有FOR UPDATE

相關問題