2012-05-14 27 views
6

Mam pytanie dotyczące zatwierdzeń mysql i transakcji.Zatwierdzenie i transakcja mysql

Mam kilka instrukcji php, które wykonują kwerendy mysql.

Czy mogę tylko powiedzieć co następuje?

mysql_query("START TRANSACTION"); 
//more queries here 
mysql_query("COMMIT"); 

Co dokładnie by to zrobiło? Jak to pomaga? Aktualizacje, usuwa i wstawki znalazłem też to do blokowania innych zapytań od czytania

mysql_query("LOCK TABLES t1 WRITE, t2 WRITE"); 
//more queries here 
mysql_query("UNLOCK TABLES t1, t2"); 

będzie to blok innych zapytań jakiegokolwiek rodzaju lub tylko pisze/wybiera?

Kolejne pytanie: Powiedz, że jedno zapytanie działa i blokuje inne zapytania. Inna próba próbuje uzyskać dostęp do zablokowanych danych - i widzi, że jest zablokowana. Jak to działa? Czy czeka na ponowne odblokowanie danych i ponowne wykonanie zapytania? Czy to po prostu zawiedzie i musi zostać powtórzone? Jeśli tak, jak mogę sprawdzić?

Wielkie dzięki!

Dennis

+0

Czy używasz tabel InnoDB lub MyISAM? – Daan

+0

@ Daan Używam InnoDB – weltschmerz

Odpowiedz

12

W InnoDB, nie trzeba jawnie rozpoczęcia lub zakończenia transakcji dla pojedynczych zapytań, jeśli nie zostały zmienione domyślne ustawienie AUTOCOMMIT, który jest „on”. Jeśli autopowiadomienie jest włączone, InnoDB automatycznie zamyka każde zapytanie SQL w transakcji, co jest równoważne z START TRANSACTION; query; COMMIT;.

Jeśli jawnie użyjesz START TRANSACTION w InnoDB z włączonym autouzupełnianiem, wszystkie zapytania wykonane po wykonaniu instrukcji START TRANSACTION będą albo wszystkie wykonywane, albo wszystkie z nich zakończą się niepowodzeniem. Jest to przydatne w środowiskach bankowych, na przykład: jeśli przelewam 500 USD na twoje konto bankowe, operacja ta powinna się powieść, jeśli suma została odjęta z mojego salda bankowego i dodana do twojej. W takim przypadku uruchomiono coś takiego, jak:

Zapewnia to, że oba zapytania będą działać poprawnie lub nie, ale nie tylko jeden. This post ma więcej informacji o tym, kiedy należy korzystać z 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 oczekiwania. Klienci powinni blokować tylko te wiersze, które rzeczywiście potrzebują, umożliwiając innym klientom dostęp do wierszy, których potrzebują. Można uzyskać więcej informacji na temat transakcji InnoDB here. Na twoje pytania dotyczące zakleszczenia można znaleźć odpowiedzi w sekcjach 14.2.8.8 i 14.2.8.9 dokumentów. Jeśli zapytanie nie powiedzie się, sterownik MySQL zwróci komunikat o błędzie wskazujący przyczynę; Twoja aplikacja powinna wtedy ponownie opublikować zapytania, jeśli jest to wymagane.

Wreszcie w twoim przykładowym kodzie użyłeś mysql_query. Jeśli piszesz nowy kod, przestań używać starej, powolnej i przestarzałej biblioteki mysql_ dla PHP i użyj zamiast tego mysqli_ lub PDO :)

+0

niesamowite, dziękuję! Czy InnoDB automatycznie blokuje tylko wiersze? I jak mogę sprawdzić, czy mój stół ma włączone automatyczne zatwierdzanie?i jak mogę ustawić na nim indeks (używam phpmyadmin)? – weltschmerz

+0

Możesz wydać zapytanie autocommit'' 'SHOW VARIABLES LIKE 'lub kliknąć' variables' na stronie głównej phpMyAdmin. Tworzenie indeksu odbywa się poprzez przejście do odpowiedniej bazy danych i tabeli, kliknięcie "struktura" i użycie formularza, który widzisz, aby utworzyć indeks. Lub możesz wydawać instrukcje SQL, np. 'ALTER TABLE table ADD INDEX (field)'. Nie jestem pewien, co masz na myśli przez "czy InnoBD automatycznie blokuje tylko wiersze" - na pewno nigdy nie zablokuje automatycznie całego stolika, jeśli o to ci chodzi :) – Daan

+0

Autocommit jest włączony :) Czy klucze podstawowe zawsze służą jako indeks? Mam klucze główne w moich tabelach i chciałem dodać indeks, ale powiedziałem, że może to być tylko ten sam klucz podstawowy ... – weltschmerz