У MySQL нет этой функции. Для тех, кто ищет эту тему в целом, некоторые РСУБД имеют лучшие/умные функции блокировки, чем другие.
Для разработчиков, ограниченных MySQL, наилучшим подходом является добавление столбца (или использование существующего, например, столбца состояния), который может быть установлен на «заблокирован» или «в процессе» или аналогичный, выполните SELECT ID, * ... WHERE IN_PROGRESS != 1 FOR UPDATE;
, чтобы получить идентификатор строки, который вы хотите заблокировать, введите UPDATE .. SET IN_PROGRESS = 1 WHERE ID = XX
, чтобы разблокировать записи.
Использование LOCK IN SHARE MODE
почти никогда не является решением, потому что пока оно позволит вам прочитать старое значение, но старое значение находится в процессе обновления, поэтому, если вы выполняете неатомную задачу, нет смысла даже в том, глядя на эту запись.
Лучше * RDBMS распознает этот шаблон (выберите одну строку, чтобы работать и блокировать ее, работать над ней, разблокировать ее) и обеспечить более разумный подход, который позволяет вам искать только разблокированные записи. Например, PostgreSQL 9.5+ предоставляет SELECT ... SKIP LOCKED
, который выбирает только из разблокированного подмножества строк, соответствующих запросу. Это позволяет вам получить эксклюзивную блокировку в строке, службу, которая завершает запись, а затем обновить &, разблокировать эту запись, не блокируя другие потоки/потребители от возможности работать независимо от себя.
* Здесь «лучше» означает с точки зрения атомных обновлений, многопользовательской архитектуры и т. Д. И не обязательно «лучше разработан» или «лучше». Не пытаясь начать огонь здесь.
Вы используете InnoDB для блокировки таблицы строк? –
Да, я использую InnoDB –