Umieszczanie wyciągu Select w transakcji

10

Jaka jest różnica między tymi 2 zapytaniami:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

I bez transakcji:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Jaki jest efekt SELECTzawarcia transakcji?

Jeśli DELETE FROM orders WHERE id=1został wywołany z innej sesji zaraz po SELECTobu przypadkach, kiedy zostanie on przetworzony?

Songo
źródło

Odpowiedzi:

5

Samo zapytanie SELECT wewnątrz transakcji nie jest odpowiednio chronione przed UPDATE i DELETE.

Czego potrzebujesz, aby użyć:

Jeśli wydasz Delete From orders Where id=1, stanie się to, gdy wiersze w orderstabeli zwolnią swoje blokady na końcu transakcji. Możesz eksperymentować (na serwerze deweloperskim / pomostowym) z wykorzystaniem READ UNCOMMITTEDpoziomu izolacji transakcji, aby logicznie usunąć usuwanie, ale tylko po zatwierdzeniu stanie się widoczne i trwale zapisane.

W drugiej transakcji zasadniczo wszystkie zakłady są wyłączone. Jeśli uciekniesz

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

uruchomi Delete From orders Where id=1się natychmiast. W zależności od kolejności, w jakiej MySQL wykonuje te instrukcje, zobaczysz (lub nie zobaczysz) usuwane wiersze.

CAVEAT

MySQL 5.6 ma teraz następujące funkcje :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Modyfikatory READ WRITE i READ TYLKO ustawiają tryb dostępu do transakcji. Pozwalają lub zabraniają wprowadzania zmian w tabelach używanych w transakcji. Ograniczenie TYLKO DO CZYTANIA zapobiega modyfikowaniu lub blokowaniu przez transakcję zarówno tabel transakcyjnych, jak i nietransakcyjnych, które są widoczne dla innych transakcji; transakcja może nadal modyfikować lub blokować tabele tymczasowe. Te modyfikatory są dostępne od MySQL 5.6.5.

RolandoMySQLDBA
źródło