MemSql> обходной путь для SELECT ... для обновления - PullRequest
0 голосов
/ 13 декабря 2018

Я использую MemSql в качестве базы данных, и мне нужно иметь SELECT ... FOR UPDATE функциональность.Однако это не поддерживается в версии 6.5, которую я использую.Есть ли обходной путь для этой проблемы?

Моя проблема заключается в следующем: несколько процессов выбирают одну запись (которая еще не была обработана) из одной и той же таблицы, выполняют некоторую работу из кода SQL, а затем выполняют UPDATE дляпометить запись как обработанную.Если бы у меня была возможность сделать SELECT ... FOR UPDATE, я мог бы заблокировать запись, чтобы убедиться, что только один процесс может выбрать ее.1007 *

UPDATE Tbl SET LockToken = 'a_unique_token' WHERE LockToken IS NULL LIMIT 1;
SELECT * FROM Tbl WHERE LockToken = 'a_unique_token';

но в этом случае я получаю

Код ошибки: 1749. Функция 'UPDATE ... LIMIT должна быть ограничена одним разделом' не поддерживается MemSQL Distributed.

Я мог бы также выполнить работу с LOCK TABLES, но согласно this они также не поддерживаются.

Есть ли обходной путь для этого типапроблемы?

1 Ответ

0 голосов
/ 13 декабря 2018

Да, ваш обходной путь - хорошая идея.Один из способов обойти эту ошибку - выбрать конкретную строку для блокировки вместо использования LIMIT 1, например UPDATE Tbl SET LockToken = 'a_unique_token' WHERE LockToken IS NULL and id = (select id from Tbl WHERE LockToken IS NULL limit 1).(Или вы можете использовать (select min(id) from Tbl WHERE LockToken IS NULL) или что-то подобное для выбора идентификатора в зависимости от того, что вы хотите.) Это должно хорошо работать, если у вас есть индекс для идентификатора.

Также вы можете проверить версию 6.7, где выберитедля обновления теперь поддерживается: https://docs.memsql.com/sql-reference/v6.7/select/.

...