ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ для заблокированных запросов

Я использую MySql 5.x, и в моем окружении есть таблица с именем CALLS.

Таблица CALLS имеет статус столбца, который принимает перечисление {inprogress, completed}.

Я хочу, чтобы чтение / обновление таблицы было заблокировано по строкам, поэтому:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET AUTOCOMMIT = 0;
SELECT amount from CALLS where callId=1213 FOR UPDATE;
COMMIT

В основном я делаю FOR UPDATE даже в ситуациях, когда мне нужно только прочитать сумму и вернуть. Я считаю, что это позволяет мне гарантировать, что операции чтения / обновления не будут мешать друг другу. Однако мне сказали, что это уменьшит параллелизм приложения.

Есть ли способ добиться такой же согласованности транзакций без накладных расходов на блокировку? Спасибо.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
953
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

То, что вы там реализовали - если вы не были знакомы с этим - называется пессимистическая блокировка. Вы жертвуете производительностью ради согласованности, что иногда является правильным выбором. По своему профессиональному опыту я обнаружил, что пессимистическая блокировка - это скорее помеха, чем помощь.

Во-первых, это может привести к тупик.

Альтернативой (лучше, imho) является оптимистическая блокировка, где вы делаете предположение, что столкновения происходят нечасто, и вы просто справляетесь с ними, когда они происходят. Вы выполняете свою работу в транзакции, поэтому коллизия не должна оставлять ваши данные в несогласованном состоянии.

Вот дополнительная информация о оптимистическая блокировка в смысле Java, но идеи применимы ко всему.

Изменения в таблице являются финансовой транзакцией и не должны приводить к противоречиям. Иначе моя компания потеряет на этом деньги. Это было моей мотивацией для использования пессимистической блокировки.

ashitaka 25.12.2008 12:46
Ответ принят как подходящий

Отказ от ответственности: MySQL обычно полон сюрпризов, поэтому следующее может быть неверным.

То, что вы делаете, для меня не имеет никакого смысла: вы совершаете фиксацию после SELECT, что должно сломать блокировку. Так что, на мой взгляд, ваш код не должен вызывать каких-либо значительных накладных расходов; но это также не дает улучшений согласованности.

В общем, SELECT FOR UPDATE может быть очень надежным и разумным способом обеспечить согласованность без использования большего количества блокировок, чем действительно необходимо. Но, конечно, его следует использовать только при необходимости. Возможно, вам следует использовать разные пути кода: один (с использованием FOR UPDATE), используемый, когда полученное значение используется в последующей операции изменения. И еще один (без использования FOR UPDATE), используемый, когда значение не нужно защищать от изменений.

Думаю, я наконец понял, КОГДА мне нужно ОБНОВЛЕНИЕ. Если я запрашиваю некоторые столбцы и принимаю некоторые решения по полученным значениям перед внесением изменений; тогда подходит FOR UPDATE. например сохраняю свою собственную таблицу автоинкремента.

ashitaka 02.01.2009 12:07

Другие вопросы по теме