2017-04-06 2 views
0

Sorry, wenn das eine dumme Frage ist. Ich habe MySQL InnoDB-Anwendung mit über 70 Tabellen und Transaktionen verwenden. Alles funktioniert gut, außer einer Sache (Tabelle):InnoDB Transaktionsprinzip

CREATE TABLE IF NOT EXISTS `mag_pj_art_sums` (
`id` int(11) NOT NULL, (primary key) 
`id_pj` int(11) NOT NULL, (index) 
`id_artikal` int(11) NOT NULL, (index) 
`kol_stanje_knjig` decimal(18,2) DEFAULT NULL) 

ich gleiches Prinzip für alle Abfragen bin mit:

START TRANSACTION (query('set autocommit=0;'); query('START TRANSACTION;');) 
SELECT … FROM table WHERE … 
UPDATE TABLE SET …. WHERE …. 
COMIT 

in allen Tabellen Primärschlüssel für SELECT und UPDATE verwendet werden (in unten Abfrageschema).

Außer mag_pj_art_sums wo ich benutze:

SELECT … FROM mag_pj_art_sums WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj') 

und

UPDATE mag_pj_art_sums SET … WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj') 

Ist es möglich, dass die Zeilen in diesem Szenario nicht gesperrt sind?

Weil, nur in dieser Tabelle habe ich inkonsistente Werte, wenn es gleichzeitige SELECT - UPDATE-Abfrage. Die Abfrage wird ohne Fehler ausgeführt, die Werte werden jedoch NICHT wie erwartet aktualisiert.

Antwort

2

Nein, sie sind nicht gesperrt. Wenn Sie die Transaktionsisolationsstufe nicht geändert haben, ist dies immer noch der Standardwert REPEATABLE-READ.
Das bedeutet, dass Phantom-Lesevorgänge möglich sind. Ich habe eine kurze Erklärung davon in this answer geschrieben.

Was sollten Sie tun, ist

START TRANSACTION; 
SELECT … FROM table WHERE … FOR UPDATE; 
UPDATE TABLE SET …. WHERE …; 
COMMIT; 

Lesen Sie mehr über SELECT ... FOR UPDATEhere.

+0

Meine Zweifel bestätigt. Vielen Dank – MiTja

1

INDEX(id_artikal), INDEX(id_pj) ist nicht das gleiche wie INDEX(id_artikal, id_pj). Fügen Sie das letztere hinzu; Beide Abfragen werden viel schneller ausgeführt.

Ja, die FOR UPDATE ist erforderlich. Diese muss für alle Fälle von START; SELECT...; UPDATE (same row)...; COMMIT hinzugefügt werden. Sie haben möglicherweise Fehler, die Sie nicht bemerkt haben!

Ich würde mich nicht um tx_isolation kümmern.

+0

Und diese neue Ebene in meinem mysql Leben öffnen :-) Lies einfach deinen fantastischen Text unter http://mysql.rjweb.org/doc.php/index_cookbook_mysql Danke – MiTja

+0

Gern geschehen, und danke für die netten Worte. Sie sind nicht allein dabei nützliche Informationen zu finden. Je mehr Leute diesen Blog lesen, desto weniger "einfache" Fragen müssen in diesem Forum beantwortet werden. –