Содержит ли запрос MySQL подзапрос атомарный?

Есть две таблицы:

Таблица 1 Уникальные сеансы

ID    Count 

Таблица 2 (Сеансы)

ID    Name

Я хотел бы обновить счетчик , только если имя не существует в сеансах для подсчета уникальных сеансов, это пример, поэтому цель не состоит в том, чтобы делать это альтернативным способом, но вопрос:

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

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

Является ли первый запрос атомарным? Если да, то проблем нет.

Если нет, то что делать, если для выполнения вышеупомянутых операций выполняется несколько потоков? Есть вероятность, что:

Поток 1: count возвращает 0, он обновил таблицу 1, но не таблицу 2 перед запуском потока 2. Поток 2: он находит счетчик 0, он также собирается обновить счетчик.

Теперь для того же пользователя счетчик равен 2, чего не должно происходить.

Любые предложения / отзывы.

10
задан Daniel Rikowski 28 April 2011 в 09:03
поделиться