2016-03-25 42 views
2

Ich versuche derzeit Transaktionsisolation in MySQL zu verstehen, lesen Sie das Buch High Performance MySQL, 2nd Edition.Read Committed Vs wiederholbare Lesevorgänge in MySQL?

Und hier sind ihre Erklärung dieser beiden Transaktion Isolationsstufe.

READ COMMITTED

Die Standardisolationsstufe für die meisten Datenbanksysteme (aber nicht MySQL!) Ist Committed Read. Es erfüllt die einfache Definition der Isolation früher verwendet: eine Transaktion wird nur diese Änderungen von Transaktionen, die bereits festgeschrieben wurden, wenn es begann begann, und seine Änderungen werden für andere sichtbar sein, bis es committed hat. Dieser Level erlaubt immer noch das, was man als nicht wiederholbares lesen kann. Das bedeutet, dass Sie die gleiche Anweisung zweimal ausführen können und verschiedene Daten sehen können: .

WIEDERHOLBARE READ

WIEDERHOLBARE READ löst die Probleme, die UNCOMMITTED LESEN ermöglicht. Es garantiert, dass alle Zeilen, die eine Transaktion liest, bei nachfolgenden Lesevorgängen innerhalb der gleichen Transaktion " " gleich aussehen, aber theoretisch erlaubt es noch ein weiteres kniffliges Problem: Phantom-Lesevorgänge. Einfach gesagt, ein Phantom lesen kann passieren, wenn Sie einen Bereich von Zeilen auswählen, fügt eine andere Transaktion eine neue Zeile in den Bereich, und dann Sie wieder den gleichen Bereich auswählen; Sie sehen dann die neue Zeile "Phantom" . InnoDB und Falcon lösen das Phantom-Leseproblem mit multiversion concurrency control, das wir später in diesem Kapitel erklären. REPEATABLE READ ist die Standard-Transaktionsisolation von MySQL. Die InnoDB- und Falcon-Speicher-Engines berücksichtigen diese Einstellung , die Sie in Kapitel 6 lernen werden. Einige andere Speicher-Engines tun dies auch, aber die Wahl liegt bei der Engine.

Fragen:

1- In READ COMMITTED wenn diese Isolationsstufe bedeutet, dass Transaktion nur Änderungen sehen kann, die von anderen Transaktionen begangen wurde, wie während der gleichen Transaktion kommen, wenn Sie gleiche Anweisung ausführen Sie können verschiedene Ergebnisse sehen? Bedeutet das Folgendes?

START TRANSACTION; 
       SELECT balance FROM checking WHERE customer_id = 10233276; 
       UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276; 
      # >>> NEXT I MUST SEE THE NEW BALANCE, OR I AM WRONG ? 
      SELECT balance FROM checking WHERE customer_id = 10233276; 
COMMIT; 

2- In WIEDERHOLBARE READ wenn diese Isolationsstufe allowes Phantom lesen, wie kommt es, dass alle Zeilen GARANTIEN ein transactin liest, wird „gleich aussehen“ in den nachfolgenden liest? Liest der Phanton nicht die Garantie dieses Niveaus?

Antwort

1

http://ronaldbradford.com/blog/understanding-mysql-innodb-transaction-isolation-2009-09-24/

WIEDERHOLBARE-READ

Sitzung 1:

MariaDB [test]> DROP TABLE IF EXISTS transaction_test; 
    Query OK, 0 rows affected (0.22 sec) 

    MariaDB [test]> CREATE TABLE transaction_test(
     -> id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
     -> val VARCHAR(20) NOT NULL, 
     -> created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
     -> PRIMARY KEY(id) 
     ->) ENGINE=InnoDB DEFAULT CHARSET latin1; 
    Query OK, 0 rows affected (0.29 sec) 

    MariaDB [test]> 
    MariaDB [test]> INSERT INTO transaction_test(val) VALUES ('a'),('b'),('c'); 
    Query OK, 3 rows affected (0.08 sec) 
    Records: 3 Duplicates: 0 Warnings: 0 

    MariaDB [test]> START TRANSACTION; 
    Query OK, 0 rows affected (0.00 sec) 
MariaDB [test]> SELECT * FROM transaction_test; 
+----+-----+---------------------+ 
| id | val | created    | 
+----+-----+---------------------+ 
| 1 | a | 2016-04-01 10:09:33 | 
| 2 | b | 2016-04-01 10:09:33 | 
| 3 | c | 2016-04-01 10:09:33 | 
+----+-----+---------------------+ 
3 rows in set (0.00 sec) 

MariaDB [test]> select sleep(50); 

dann BENUTZER2 laufen nächsten Code:

MariaDB [test]> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> INSERT INTO transaction_test(val) VALUES ('x'),('y'),('z'); 

commit; 

dann user 1

MariaDB [test]> SELECT * FROM transaction_test; 
+----+-----+---------------------+ 
| id | val | created    | 
+----+-----+---------------------+ 
| 1 | a | 2016-04-01 10:09:33 | 
| 2 | b | 2016-04-01 10:09:33 | 
| 3 | c | 2016-04-01 10:09:33 | 
+----+-----+---------------------+ 
3 rows in set (0.00 sec) 

MariaDB [test]> 

READ-committed

benutzer1

SET SESSION tx_isolation='READ-COMMITTED'; 
TRUNCATE TABLE transaction_test; 
INSERT INTO transaction_test(val) VALUES ('a'),('b'),('c'); 
MariaDB [test]> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> select sleep(60); 

dann USER2 laufen nächsten Code:

MariaDB [test]> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> INSERT INTO transaction_test(val) VALUES ('x'),('y'),('zwfwfw'); 

Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

MariaDB [test]> commit; 

dann Benutzer1 Abfrage beenden:

MariaDB [test]> SELECT * FROM transaction_test; 
+----+--------+---------------------+ 
| id | val | created    | 
+----+--------+---------------------+ 
| 1 | a  | 2016-04-01 10:28:08 | 
| 2 | b  | 2016-04-01 10:28:08 | 
| 3 | c  | 2016-04-01 10:28:08 | 
| 4 | x  | 2016-04-01 10:29:00 | 
| 5 | 
y  | 2016-04-01 10:29:00 | 
| 6 | zwfwfw | 2016-04-01 10:29:00 | 
+----+--------+---------------------+ 
6 rows in set (0.00 sec) 
2

Nach meinem Verständnis angenommen Gleichgewicht war 1000, bevor Sie diese Transaktion starten.

Nach Transaktion gestartet und es der Aktualisierung auf „Balance = Balance - 200“, wenn Sie innerhalb der Transaktion wieder select-Anweisung ausführen, dann werden die Ergebnisse sein, wie pro unten-

  1. Wenn Isolationsstufe dann Committed Read wird Sie sieht das Ergebnis als 800.

  2. Wenn Isolationsstufe ist wiederholbar READ dann werden Sie sehen das Ergebnis als 1000.

1

In READ COMMITED, können Sie die Informationen sehen, die begangen worden war, unabhängig davon, ob Sie in einer Transaktion sind oder nicht, so Die Integration in die Informationen ist nicht garantiert, da sie mehrmals geändert werden kann. Statt dessen ist wiederholbar READ, die Sie in einem ocurrence einer Transaktion die Änderung (UPDATE) von Informationen (Integrität) verbietet, aber Sie können zusätzliche Information (INSERT ...)

Verwandte Themen