2017-05-08 3 views
1

Ich habe einen Nodejs Web-Service mit MariaDB-Server und ca. 500 täglich aktive Benutzer in meiner App.MariaDB mehrere identische Zeile auch bei Verwendung REPEATABLE READ Transaktion

In meinem Code verwende ich eine Transaktion wie folgt:

START TRANSACTION 

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

COMMIT 

diese Transaktion in keiner doppelten Zeile eingefügt führen soll, aber es funktioniert nicht.
Ich denke, das passiert, wenn 2 Anfragen mit verschiedenen Sitzungen zur gleichen Zeit ankommt und sehen, dass die Zeile nicht existiert und dann beide Sitzungen es einfügen.

Die Transaktionsisolationsstufe MariaDB ist REPEATABLE-READ.

Ist dies wegen REPEATABLE READ Isolation-Level?

Wie kann man Lese- und Schreibvorgänge exklusiv sperren, wenn eine andere Sitzung dieselbe Zeile lesen kann?

Antwort

0

Stattdessen führen Sie einen von ihnen, von denen ‚Atom‘ und nicht BEGIN/COMMIT um es braucht, es sei denn es andere Aussagen, die in der gleichen Transaktion gehören:

INSERT IGNORE ...; 

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

Um zu erklären, was mit falsch unser Code: Sie sollten FOR UPDATE auf dem SELECT haben.

Verwandte Themen