Подтвердить что ты не робот

Как заблокировать одну строку

У меня есть таблица user с полем lastusedecnumber.

Мне нужно получить доступ и увеличить lastusedecnumber.

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

Как это сделать?

Тип таблицы MyISAM.

4b9b3361

Ответ 1

MySQL использует только блокировку на уровне таблицы из таблиц MyISAM. Если вы можете, переключитесь на InnoDB для блокировки на уровне строк.

Здесь ссылка на сайт MySQL, описывающий блокировки, установленные операторами SQL для таблиц InnoDB. http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html

Ответ 2

Поздно, но надеюсь, что это поможет кому-то:

UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1);
SELECT LAST_INSERT_ID();

Дает вам атомный приращение lastusedecnumber и возможность читать новое значение поля lastusedecnumber (после увеличения) с помощью SELECT LAST_INSERT_ID().

Ответ 3

В качестве обходного пути вы можете добавить столбец в таблицу, например locked TINYINT(1) - всякий раз, когда вы хотите, чтобы строка была заблокирована, вы установите ее на 1. Когда вы пытаетесь получить доступ к этой строке, первое, что вы делаете, это проверить, установлены ли поля locked.

Чтобы разблокировать строку, просто установите ее в 0 снова. Нехорошо, но очень просто обходное решение.

Ответ 4

Мне не хотелось конвертировать всю мою базу данных из myisam. Поэтому я просто пытаюсь создать новую таблицу с именем на основе идентификатора записи, которую я хочу заблокировать. Если создать таблицу успешно, выполните мою работу и удалите таблицу в конце. Если создать таблицу не удалось, остановитесь.

Ответ 5

Лучшим обходным решением является создание столбца, содержащего временную метку. Всякий раз, когда вы хотите заблокировать строку, вы обновляете ее до текущего времени. Чтобы разблокировать обновление до времени не менее x минут в прошлом. Затем, чтобы проверить, заблокирована ли его проверка того, что отметка времени не менее 6 минут.

Таким образом, если процесс выходит из строя (или пользователь никогда не завершает свою работу), блокировка эффективно заканчивается через x минут.