Лучший способ блокировки элемента во время обновления

Я создаю веб-сайт (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 в оракуле, так что это ничего революционного

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