Лучший способ блокировки элемента во время обновления
Я создаю веб-сайт (C#/SQL Server 2008, .net), который должен разрешать обновление некоторой общей информации, которая может быть доступна пользователям.
Например, у меня есть 2 пользователя и таблица, которая содержит несколько элементов. Очень похоже на очередь модерации.
Допустим, он содержит строки с идентификаторами #1, #2, #3
Если пользователь 1 сначала выбирает # 1, его необходимо немедленно заблокировать, пока он не будет разблокирован / и доступен.
У меня есть пара вопросов, так как для меня это неизведанная территория.
- Каков наилучший способ блокировки этой строки в SQL?
- Будучи пользователем без состояния, как пользователь 2 может быть осведомлен о том, что пользователь 1 заявил о своей позиции #1? Лучше использовать подход "следующий доступный"?
Заранее спасибо.
1 ответ
У вас есть то, что называется оптимистической блокировкой. Но это, по крайней мере, не решает проблему "сообщения" о том, что строка заблокирована. В большинстве случаев отчетность бесполезна, но ее можно решить программно.
Эта блокировка довольно забавная, зависит от того, делаете ли вы настольное или веб-приложение, но в основном это решается с помощью дополнительного столбца (отметка времени) и блокировки строки на определенный период времени.
Я сделал один проект, в котором сообщил, что пользователь заблокировал строку, и решил ее с помощью 2 полей (время начала, время окончания), потому что я хотел дать переменное количество времени человеку для обновления строки.
образец:
query: select a, b, c, d, start_time, end_time FROM table
Program : if ((datetime.now()-start time > 1min) or (end_time <> null))
{
update table
SET start_time = datetime.now()
set end_time = null
where A = a and B = b and C= c and D = d, and START_TIME = start_time
--big caps is current value, small caps value from last select ( and that is OPTIMISTIC concurency).
}
else
{
messagebox.show ("You suck, cant be changed") --personal touch :-)
}
когда вы обновляете строку, не забудьте поместить end_time.
OFC, проверить на время, в рамках обновления возможно
Редактировать: я получил эту идею от row_scn в оракуле, так что это ничего революционного