2011-01-28 5 views
18

Aktualnie korzystam z bazy danych MySQL. Wszystkie moje tabele korzystają z InnoDB.Współbieżność MySQL, jak to działa i czy potrzebuję go obsłużyć w mojej aplikacji

Każdy, kto loguje się do mojej aplikacji, może wyświetlać rekordy i obawiam się, że w pewnym momencie dwóch użytkowników może zaktualizować lub wstawić rekord w tym samym czasie. Czy MySQL z wdzięcznością obsługuje ten typ współbieżności, czy jest to coś, co będę musiał zaprogramować w moim kodzie?

Jeśli muszę zaprogramować go w moim kodzie, jak masz zamiar obsługiwać przypadku równoczesnego w ten sposób?

+0

Nie musisz się tym przejmować. Współczesne bazy danych są wystarczająco inteligentne w kontrolowaniu współbieżności :) – Tauquir

+0

to, co sobie wymyśliłem, chciałem tylko sprawdzić dwukrotnie – medium

Odpowiedz

20

Instrukcje SQL są atomowe. Oznacza to, że jeśli wykonać coś takiego:

UPDATE Cars SET Sold = Sold + 1 

Nikt nie może zmienić zmienną Sold w tym oświadczeniu. Jest zawsze zwiększany o 1, nawet jeśli ktoś inny wykonuje to samo polecenie jednocześnie.

Problem pojawia się, jeśli masz wypowiedzi, które są zależne od siebie:

a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 

pomiędzy tymi zapytaniami, inny użytkownik może zmienić tabeli Samochody i aktualizacji sprzedany. Aby temu zapobiec, należy zawrzeć transakcję:

BEGIN; 
a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 
COMMIT; 

Transakcje są obsługiwane przez InnoDB, ale nie przez MyISAM.

+2

dziękuję za to wyjaśnienie. – medium

+2

Nawet w transakcji nie ma gwarancji. MySQL domyślnie blokuje/blokuje blokowanie na poziomie wiersza tylko dla operacji zapisu, nawet w transakcjach. Aby ** ** miało poprawną wartość, konieczne jest wstawienie * DO AKTUALIZACJI * w polu WYBRAĆ lub podanie wyższego * poziomu izolacji * w przypadku TRANSAKCJI jako * SERIALIZABLE *. ** Więcej informacji: ** [Blokowanie wewnętrzne] (https://dev.mysql.com/doc/refman/5.6/en/internal-locking.html), [Poziomy izolowania] (https: //dev.mysql .com/doc/refman/5.6/en/innodb-transaction-isolation-levels.html), [Blokowanie odczytywania] (https://dev.mysql.com/doc/refman/5.6/en/innodblocking- reads.html) –

Powiązane problemy