транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 09:50
Оценка:
Здравствуйте. Возможно у меня дурацкий вопрос.
Есть два клиента, оба одновременно правят одну и туже запись.
Действия клиента.
1. Читаем данные из бд
2. Кешируем их
3. Пользователь редактирует данные в кеше.
4. Открываем транзакцию, пишем в бд, закрываем транзакцию

Вот теперь вопрос, при записи данных 1 клиентом в бд, 2 клиент, не записавший еще
их в бд имеет у себя в кеше недостоверные данные. Как при записи данных 2 клиентом проверить, не внес ли кто до него
изменения? И в этом случае не дать выполнить изменения ?
Держать открытой транзакцию на все время жизни форма(диалога) — имхо не верно.
Проверять ручками на верность записей — вроде тоже маразм. Как это решается правильно?
Re: транзакции, блокировки?
От: Merle Австрия http://rsdn.ru
Дата: 19.02.04 10:18
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А> Как это решается правильно?

СУБД?
А вообще вот отличный ликбез от Sinclair'а по этому поводу: http://www.rsdn.ru/Forum/Message.aspx?mid=91161&only=1
Автор: Sinclair
Дата: 27.08.02
Мы уже победили, просто это еще не так заметно...
Re: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 10:22
Оценка: -2
блокирование на уровне приложения — два поля, кто и восколько "заблокировал", если клиент умер/ушел в запой — решается на уровне приложения ... в веб приложениях (когда каждый раз другая сесия) другого варианта и нет.

Gt_
Re: транзакции, блокировки?
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.02.04 10:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:
А>Вот теперь вопрос, при записи данных 1 клиентом в бд, 2 клиент, не записавший еще
А>их в бд имеет у себя в кеше недостоверные данные. Как при записи данных 2 клиентом проверить, не внес ли кто до него
А>изменения? И в этом случае не дать выполнить изменения ?
А>Держать открытой транзакцию на все время жизни форма(диалога) — имхо не верно.
А>Проверять ручками на верность записей — вроде тоже маразм. Как это решается правильно?

http://rsdn.ru/Forum/Message.aspx?mid=91161&amp;only=1
Автор: Sinclair
Дата: 27.08.02
уже читал?
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: транзакции, блокировки?
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.02.04 11:04
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>http://rsdn.ru/Forum/Message.aspx?mid=91161&amp;only=1
Автор: Sinclair
Дата: 27.08.02
уже читал?

Упс, пока синхронизировался, уже запостили. Тогда второй вопрос:
Это http://rsdn.ru/Forum/Message.aspx?mid=121769&amp;only=1
Автор: Sinclair
Дата: 28.10.02
читал?
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 11:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Sinclair, Вы писали:

S>>http://rsdn.ru/Forum/Message.aspx?mid=91161&amp;only=1
Автор: Sinclair
Дата: 27.08.02
уже читал?

S>Упс, пока синхронизировался, уже запостили. Тогда второй вопрос:
S>Это http://rsdn.ru/Forum/Message.aspx?mid=121769&amp;only=1
Автор: Sinclair
Дата: 28.10.02
читал?


Спасибо огромное, Sinclair, Merle.
Инфы много, перевариваю. Совсем уж хамство, но как задать lock на таблицу (ы)
средствами TSQL в SQL Server? Еще интересно, лок сохраняется внутри конкретной транзакции
или до тех пор пока не снимешь? Еще раз прошу прощения, понимаю в BOL это все дожно быть,
просто голова кипит — перевариваю.
Re[4]: транзакции, блокировки?
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.02.04 12:05
Оценка: :)
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо огромное, Sinclair, Merle.
А>Инфы много, перевариваю. Совсем уж хамство, но как задать lock на таблицу (ы)
А>средствами TSQL в SQL Server? Еще интересно, лок сохраняется внутри конкретной транзакции
А>или до тех пор пока не снимешь? Еще раз прошу прощения, понимаю в BOL это все дожно быть,
А>просто голова кипит — перевариваю.
Блокировки в MS SQL Server
Автор(ы): Алексей Ширшов
Дата: 15.11.2003
В статье рассказывается о уровнях изоляции транзакций и механизме блокировок, обеспечивающем поддержку этих уровней в СУБД MS SQL Server 2000. Предполагается, что читатель хорошо знаком с транзакциями и их свойствами.
читал?
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 13:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Блокировки в MS SQL Server
Автор(ы): Алексей Ширшов
Дата: 15.11.2003
В статье рассказывается о уровнях изоляции транзакций и механизме блокировок, обеспечивающем поддержку этих уровней в СУБД MS SQL Server 2000. Предполагается, что читатель хорошо знаком с транзакциями и их свойствами.
читал?

Спасибо за ссылку,но вот в чем дело, блокировки-то действуют в рамках транзакции, то есть для этого нужно всю форму(диалог) при загрузке держать в транзакции. А это выходит длинная транзакция, пока там пользователь будет пить чай, транзакция будет висеть(ну допустим ограничение по времени жизни как-то сделать). А этого мне не хотелось бы. Остается вариант 2? Самому как-то определять изменения данных? Есть ли еще варианты? Или я что-то не так понял?
Re[2]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 13:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>блокирование на уровне приложения — два поля, кто и восколько "заблокировал", если клиент умер/ушел в запой — решается на уровне приложения ... в веб приложениях (когда каждый раз другая сесия) другого варианта и нет.


Спасиб, просто я думал, что должны быть более элегантные решения...Но пока не нахожу их.
Re[6]: транзакции, блокировки?
От: Merle Австрия http://rsdn.ru
Дата: 19.02.04 13:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Или я что-то не так понял?

см. "пользовательские блокировки" sp_addlock, sp_releaselock.
Мы уже победили, просто это еще не так заметно...
Re[7]: транзакции, блокировки?
От: Merle Австрия http://rsdn.ru
Дата: 19.02.04 13:26
Оценка:
Здравствуйте, Merle, Вы писали:

А>> Или я что-то не так понял?

M>см. "пользовательские блокировки" sp_addlock, sp_releaselock.

Тьфу, sp_GetAppLock, sp_ReleaseAppLock, совсем плохой стал. Скорее всего их функциональности хватит за глаза. Прежде чем реализовывать что-то свое, надо максимально использовать возможности сервера.
Мы уже победили, просто это еще не так заметно...
Re[6]: транзакции, блокировки?
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.02.04 13:44
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Sinclair, Вы писали:


S>>Блокировки в MS SQL Server
Автор(ы): Алексей Ширшов
Дата: 15.11.2003
В статье рассказывается о уровнях изоляции транзакций и механизме блокировок, обеспечивающем поддержку этих уровней в СУБД MS SQL Server 2000. Предполагается, что читатель хорошо знаком с транзакциями и их свойствами.
читал?

А>Спасибо за ссылку,но вот в чем дело, блокировки-то действуют в рамках транзакции, то есть для этого нужно всю форму(диалог) при загрузке держать в транзакции. А это выходит длинная транзакция, пока там пользователь будет пить чай, транзакция будет висеть(ну допустим ограничение по времени жизни как-то сделать). А этого мне не хотелось бы. Остается вариант 2? Самому как-то определять изменения данных? Есть ли еще варианты? Или я что-то не так понял?
Ты по-моему чего-то недочитал.
1. Длинные транзакции считаются злом. В принципе, можно пользоваться и ими, принимая во внимание следующие вещи:
а) все доступы к данным надо аккуратно снабжать соответствующими хинтами, чтобы получить требуемую блокировку. Например, нажали кнопочку Edit — select with (updlock).
б) таймауты по умолчанию стоят в бесконечность. Чтобы корректно обнаруживать залоканность чего бы то ни было, надо их ставить в конечные значения
в) в любом случае время жизни таких блокировок ограничено временем жизни транзакции, т.е. при дедлоке (от неаккуратности) или при рестарте приложения/потере соединения с сервером блокировки исчезнут.
2. Можно сделать самопальные персистентные блокировки, как я описал здесь
Автор: Sinclair
Дата: 28.10.02
. Они выживают отключение приложения, и позволяют сохранять на сервере промежуточные результаты. Кроме того, они по природе своей не требуют постоянного подключения и открытой транзакции — можно подконнектиться, забрать документ, отключиться, поработать, а потом снова подключиться и отдать результат.
Трудоемкость в обоих случаях примерно одинаковая.(имхо).
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: транзакции, блокировки?
От: Merle Австрия http://rsdn.ru
Дата: 19.02.04 13:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть ли еще варианты?

Сделать именно так, как ты хотел в первоначальном сообщении, можно с помощю типа rowversion (aka timestamp).
Поле этого типа автоматически меняется при изменении любого другого поля в записи. Таким образом, запомнив предыдущее значение, можно отследить факт изменения записи.
С помощью такого механизма оптимистические блокировки реализуются элементарно, но боюсь это немного не то, что тебе нужно.
Мы уже победили, просто это еще не так заметно...
Re[7]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 14:00
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ты по-моему чего-то недочитал.

Точнее перечитал.
S>1. Длинные транзакции считаются злом. В принципе, можно пользоваться и ими, принимая во внимание следующие вещи:
S>а) все доступы к данным надо аккуратно снабжать соответствующими хинтами, чтобы получить требуемую блокировку. Например, нажали кнопочку Edit — select with (updlock).
S>б) таймауты по умолчанию стоят в бесконечность. Чтобы корректно обнаруживать залоканность чего бы то ни было, надо их ставить в конечные значения
S>в) в любом случае время жизни таких блокировок ограничено временем жизни транзакции, т.е. при дедлоке (от неаккуратности) или при рестарте приложения/потере соединения с сервером блокировки исчезнут.
Спасибо, в общем мне надо не много изменить свой подход. Придется все же создавать транзакцию при начале редактирования, но со всеми необходимыми условиями и убивать ее только после выхода из формы.
Видимо без этого никак.

S>2. Можно сделать самопальные персистентные блокировки, как я описал здесь
Автор: Sinclair
Дата: 28.10.02
.

Да весьма интересный подход. Но я все же предпочту чтобы за блокировкой следил делал сервер.
В моем случае, проще изменить под первый подход.
Огромное спасибо.
Re[8]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 14:02
Оценка: -1
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Merle, Вы писали:


А>>> Или я что-то не так понял?

M>>см. "пользовательские блокировки" sp_addlock, sp_releaselock.

M>Тьфу, sp_GetAppLock, sp_ReleaseAppLock, совсем плохой стал. Скорее всего их функциональности хватит за глаза. Прежде чем реализовывать что-то свое, надо максимально использовать возможности сервера.


Спасибо большое за ответ, но вообше-то эта штука для пользовательских ресурсов,то есть форм и проч, хотелось бы все же на объекты бд блокировки делать.
Re[8]: транзакции, блокировки?
От: Merle Австрия http://rsdn.ru
Дата: 19.02.04 14:07
Оценка:
Здравствуйте, Аноним, Вы писали:

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

А>Видимо без этого никак.

Не связывайся с этим, горя хлебнешь...
Пользовательские блокировки вполне держатся не на время транзакции, а на время сессии, если мне память не изменяет.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ga-gz_5gh5.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ra-rz_9p2h.asp

Они как раз придуманы примерно для таких случаев.
Мы уже победили, просто это еще не так заметно...
Re[7]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 14:08
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Есть ли еще варианты?

M>Сделать именно так, как ты хотел в первоначальном сообщении, можно с помощю типа rowversion (aka timestamp).

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

M>С помощью такого механизма оптимистические блокировки реализуются элементарно, но боюсь это немного не то, что тебе нужно.
Да, спасибо, я тоже обдумывал этот вариант, но пока отставил его как вариант, не "серверный", так скажем.
Re[9]: транзакции, блокировки?
От: Merle Австрия http://rsdn.ru
Дата: 19.02.04 14:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо большое за ответ, но вообше-то эта штука для пользовательских ресурсов,то есть форм и проч, хотелось бы все же на объекты бд блокировки делать.

Зачем?
В данном случае (при редактировании формы пользователем) нужна именно блокировка некоего абстрактного объекта типа "документ". Нет никакого смысла привязываться к конкретным записям конкретной таблицы, это лишь добавит головной боли и не даст никакой выгоды.
Мы уже победили, просто это еще не так заметно...
Re[9]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 14:13
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


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

M>Пользовательские блокировки вполне держатся не на время транзакции, а на время сессии, если мне память не изменяет.
Эх!. Я уже и так хлебаю от души. Тут некоторые вопросы с названием ресурсов, на которые делается лок, откуда эти названия берутся, точнее как их определить, по имени в ресурсах что-ли, пока ничего не в голову не лезет. Попробую оба варианта или и тот и другой))
.
Re[3]: транзакции, блокировки?
От: Аноним  
Дата: 19.02.04 15:44
Оценка: -1
других нету, или сервер или кривые ручки ...
с сервером основные "плюсы" ты я так понял выяснил, но учти что может появится вариант с вебом/апп сервером который ходит с одним логином, да и умершие сессии не всегда отваливаются по таймауту. Короче это нормальный способ, который юзаются во многих серьезных решениях.

Gt_
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.