SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.11.2019 08:18:10

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 398

Одновременная обработка задач

Есть несколько процессов, которые параллельно обрабатывают задачи.
Задача берется в работу если изменяется дата с null на текущую

UPDATE Task SET StartDate = NOW()
WHERE id = @id
  AND StartDate IS NULL;

Возможен ли случай когда несколько процессов берут в работу одну задачу?

Неактивен

 

#2 25.11.2019 09:30:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6722

Re: Одновременная обработка задач

Наша задача придумать плохой сценарий, при котором берут?
Пусть будет такой:

BEGIN;
UPDATE Task SET StartDate = NOW() WHERE id = @id AND StartDate IS NULL; -- тут берется блокировка
-- тут выполняется реальная работа
-- а вот тут хотелось COMMIT, но мы упали, и вторая задачка, которая ждала блокировку, благополучно подхватила.


Но для нормального сценария должно работать smile

Неактивен

 

#3 25.11.2019 09:47:23

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 398

Re: Одновременная обработка задач

smile Конечно.
Но вопрос немного в другом.
У меня есть подозрения, что скрипт

UPDATE Task SET StartDate = NOW() WHERE id = @id AND StartDate IS NULL;

Возвращает "1" для разных процессов одной задачи (id одинаковое). Такое может быть в принципе? Транзакции не используем.

Неактивен

 

#4 25.11.2019 22:33:22

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6722

Re: Одновременная обработка задач

При условии, что InnoDB, над (id) есть уникальный ключ, то без баги в MySQL не могу придумать. Тут сильно помогут логи, когда задача взялась. Прям написать время и id.

Неактивен

 

#5 26.11.2019 04:31:42

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 398

Re: Одновременная обработка задач

InnoDB и id - уникальный ключ.
Спасибо! Буду анализировать логи.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson