W InnoDB nie musisz jawnie rozpoczynać ani kończyć transakcji dla pojedynczych zapytań, jeśli nie zmieniłeś domyślnego ustawienia automatycznego zatwierdzania, które jest „włączone”. Jeśli autocommit jest włączone, InnoDB automatycznie zamyka każde zapytanie SQL w transakcji, co jest odpowiednikiem START TRANSACTION; query; COMMIT;
.
Jeśli jawnie używasz START TRANSACTION
w InnoDB z włączonym autocommit, następnie wszelkie zapytania wykonywane po START TRANSACTION
albo wszystkie zostaną wykonane, albo wszystkie zakończą się niepowodzeniem. Jest to przydatne w środowiskach bankowych, na przykład:jeśli przelewam 500 USD na twoje konto bankowe, ta operacja powinna się powieść tylko wtedy, gdy kwota została odjęta od mojego salda bankowego i dodana do twojego. Więc w tym przypadku możesz uruchomić coś takiego
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
Gwarantuje to, że albo oba zapytania zostaną wykonane pomyślnie, albo żadne, ale nie tylko jedno. Ten post ma więcej informacji na temat tego, kiedy należy używać transakcji.
W InnoDB bardzo rzadko będziesz musiał blokować całe tabele; InnoDB, w przeciwieństwie do MyISAM, obsługuje blokowanie na poziomie wiersza. Oznacza to, że klienci nie muszą blokować całej tabeli, zmuszając innych klientów do czekania. Klienci powinni blokować tylko te wiersze, których faktycznie potrzebują, umożliwiając innym klientom dalszy dostęp do tych, których potrzebują.
Więcej informacji o transakcjach InnoDB znajdziesz tutaj . Odpowiedzi na pytania dotyczące zakleszczenia znajdują się w sekcjach 14.2.8.8 i 14.2.8.9 dokumentów. Jeśli zapytanie się nie powiedzie, sterownik MySQL zwróci komunikat o błędzie wskazujący przyczynę; Twoja aplikacja powinna następnie ponownie wysłać zapytania, jeśli jest to wymagane.
Wreszcie w przykładowym kodzie użyłeś mysql_query
. Jeśli piszesz nowy kod, przestań używać starego, wolnego i przestarzałego mysql_
biblioteka dla PHP i użyj mysqli_
lub PDO zamiast tego :)