LINUX.ORG.RU

[mysql] lock table?

 


0

0

Допустим, есть некое условие в таблице A, после которого в таблицу B нельзя больше добавлять значения.

Как такое реализовать, допустим, на MySQL не опасаясь race condition?

Нужно делать lock table?

P.S. Триггеры, к сожалению, использовать нельзя, т.к. пишется на ORM, который этого не умеет.

★★★★

Че-то странного тебе хочется!

Допустим, ты залочил А на запись, в это время кто-то рвется в А записать стоп-запись, а ты спокойненько записываешь что-то в В и потом дозволяешь таки записать стоп-запись в А.

Подозреваю, что тебе нужны транзакции.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Ок. Объясню подробнее. Допустим у меня есть много вариантов текста, которые сабмитят пользователи. Когда я выбираю один из вариантов, то все остальные нужно удалить и запретить добавлять.

Решение таблица A содержит подтверждённый мной текст. Таблица B - пользовательские варианты.

Когда я выбираю один из текстов, то запираю A, добавляю стоп-запись в А, удаляю ненужные варианты из B, открываю A.

Когда пользователь добавляет запись, он запирает А, смотрит, есть ли там стоп запись, если нет, добавляет в B свой вариант, открывает A.

Ну, фактически, A является семафором. А результирующие операции атомарными.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

> Когда я выбираю один из текстов, то запираю A, добавляю стоп-запись в А, удаляю ненужные варианты из B, открываю A.

Пока ты его выбираешь, юзера успеют добавить кучу новых текстов в В. (Или ты собираешь лочить на все время выборки?)

Так что можно не опасаться гонок, а просто добавить стоп-запись в А.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

"выбираешь" я понял как "кто-то выбирает через гуй".

А если программно -- то можно

1. добавить неопределенную стоп-запись в А

2. выбрать правильную запись из В

3. обновить стоп-запись

www_linux_org_ru ★★★★★
()

> Нужно делать lock table? У нас есть специальный демон. Lock-сервис. Что-то типа сетевых мютексов. Работает не только для базы данных, а для любых других операций с пользователем.

В принципе тоже самое можно сделать и не базе данных или на файловой системе, но демон - быстрее.

stpg
()
Ответ на: комментарий от www_linux_org_ru

> А если программно -- то можно

короче, в качестве семафора использовать не целую таблицу А, а одну запись из нее -- т.е. добавление в В, если оно действительно должно быть засемафорено, делается так: добавляем неопределенную стоп-запись в А, проверяем что добавили ее именно мы, добавляем в В, удаляем неопределенную стоп-запись в А

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> короче, в качестве семафора использовать не целую таблицу А, а одну запись из нее -- т.е. добавление в В, если оно действительно должно быть засемафорено, делается так: добавляем неопределенную стоп-запись в А, проверяем что добавили ее именно мы, добавляем в В, удаляем неопределенную стоп-запись в А

неправильно. А как же ошибки? Делаем так:

добавляем

insert key=key, lock_time=now()+lock_time.

Если проваливается - то делаем

update key=key, lock_time=now()+lock_time where lock_time < now()

если удачно - используем ресурс, а потом удаляем его.

Если произойдет ошибка - то ресурс будет недоступен максимум lock_time секунд.

stpg
()
Ответ на: комментарий от stpg

> неправильно. А как же ошибки? Делаем так:

кстати да, лок целой таблицы нельзя задать на какое-то время -- надо использовать аналогичную технику

www_linux_org_ru ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.