2011-04-28 14 views
9

Istnieją dwie tabele:Czy kwerenda MySQL zawierająca pod-zapytanie atomowe?

Tabela 1 Unikalne Sesje

ID Count 

Tabela 2 (Sesje)

ID Name 

Chciałbym zaktualizować count tylko jeśli name nie istnieje do sesji, aby policzyć unikalne sesje, jest to przykład, więc celem nie jest zrobienie tego w alternatywny sposób, ale que stion jest:

Rowsaffected = Update table1 
        set Count = Count + 1 
       where (Select count(*) from table2 where Name = 'user1') = 0; 

Insert into table2 (NAME) values('user'); 

Czy pierwsze zapytanie to zapytanie atomowe? Jeśli tak, to nie ma problemu.

Jeśli nie, to Co jeśli istnieje wiele wątków do wykonania wyżej wymienionych operacji? Istnieje prawdopodobieństwo, że:

Wątek 1: count zwraca 0, zaktualizował tabelę 1, ale nie tabelę 2 przed rozpoczęciem wątku 2. Wątek 2: Wylicza liczbę 0, a także aktualizuje licznik.

Dla tego samego użytkownika liczba wynosi 2, co nie powinno się zdarzyć.

Wszelkie sugestie/opinie.

Odpowiedz

1

To zależy od używanego mechanizmu magazynowania.

Wasz przykład będzie działał poprawnie tylko z silnikami MySQL, które obsługują transakcje, jak InnoDB, jak to poprawnie implementuje obsługi transakcji (i poziom oświadczeniem wygłoszonym konsystencję)

MyISAM nie obsługuje transakcji.

+1

@Johan: który inny silnik w MySQL obsługuje transakcje? Nie jestem świadomy innych niż InnoDB –

+0

E.g. NDBCluster, BDB – Johan

+0

Używam InnodDB, więc masz na myśli pierwsze zapytanie o charakterze atomowym, tj. Do zakończenia zapytania, nikt inny nie będzie w stanie odczytać tego stołu? – Navin

Powiązane problemy