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.
@Johan: który inny silnik w MySQL obsługuje transakcje? Nie jestem świadomy innych niż InnoDB –
E.g. NDBCluster, BDB – Johan
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