Код: Выделить всё
CREATE TABLE lock_table (
key_name VARCHAR(255) NOT NULL,
UNIQUE KEY (key_name)
) ENGINE = InnoDB;
- job1 получает блокировку, используя:
Код: Выделить всё
SELECT * FROM lock_table WHERE key_name = 'resource1' FOR UPDATE;
- Пока задание 1 выполняется, задание 2 и задание 3 также запрашивают одну и ту же блокировку:
Код: Выделить всё
SELECT * FROM lock_table WHERE key_name = 'resource1' FOR UPDATE;
- После завершения задания 1 я хочу, чтобы задания в очереди (задание2 и задание3) для выполнения в том порядке, в котором они запросили блокировку.
< ol>
[*]Гарантирует ли механизм MySQL SELECT ... FOR UPDATE, что задания (job2 и job3) будут выполняться в том порядке, в котором они запросили блокировку?
[*]Есть ли официальная ссылка на документацию MySQL, в которой объясняется, как MySQL обрабатывает порядок запросов блокировки в очереди?[*]Является ли этот подход лучшей практикой для сериализации выполнения заданий или есть лучший способ добиться этого?
Я разрабатываю система, в которой несколько заданий (задание1, задание2, задание3 и т. д.) могут попытаться обработать один и тот же ресурс одновременно. Чтобы обеспечить сериализованное выполнение, я использую MySQL SELECT... FOR UPDATE, чтобы заблокировать ресурс на основе его key_name.
Подробнее здесь: https://stackoverflow.com/questions/793 ... for-update
Мобильная версия