Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Долгие транзакции - Короткие транзакции / 25 сообщений из 62, страница 1 из 3
10.03.2005, 16:26
    #32953912
Marat_L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Вот такая у нас ситуация:

Каждый раз пользователь открывая документ начинает транзакцию, закрывая его - завершает транзакцию. Поскольку пользователь может держать документ открытым довольно долго, мы прыгаем/выкручиваемся, чтобы он блокировал при работе как можно меньше записей.

А говорят - как-то можно открывать транзакцию только в момент сохранения документа. Пока документ просто открыт - никаких транзакций нет.

Говорят - это лучше, но как тогда дать другому понять, что документ занят?
Мы как раз блокируем его в транзакции.

Поделитесь опытом, если не жалко.
:)

Жизнь коротка - потерпи немного :)
...
Рейтинг: 0 / 0
10.03.2005, 16:33
    #32953937
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Marat_L пишет:

> Каждый раз пользователь открывая документ начинает транзакцию, закрывая
> его - завершает транзакцию. Поскольку пользователь может держать
> документ открытым довольно долго,

Так делать нельзя.

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

Отдельный механизм блокирования. Например таблица блокировок и процедура
типа LockObject(ObjType, ObjId), которая либо заносит блокировку, либо
ругается, что такая уже есть. Делается элементарнейше!
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
10.03.2005, 16:58
    #32954007
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Вообще говоря, как я понимаю, зависит от базы и от бизнес-правил. Например, если Oracle, который блокирует с точностью до 1 строки и при этом другой пользователь НИ В КОЕМ СЛУЧАЕ не должен в это время менять эту строку - тогда можно блокировать в начале транзакции и не заморачиваться с доп. механизмами. Если база блокирует не 1 строку, а, например, целый блок, или если допустимо изменять этот документ другими пользователями, пока данный user редактирует документ - тогда блокировка непосредственно перед записью или наворачивание доп. механизмов над стандартными механизмами самой базы
...
Рейтинг: 0 / 0
10.03.2005, 18:10
    #32954213
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Говорят - это лучше, но как тогда дать другому понять, что документ занят?

Занят - для чтения или для записи или для того и для другого?


Если последний вариант - то у вас все правильно реализовано
...
Рейтинг: 0 / 0
11.03.2005, 08:57
    #32954703
Marat_L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Александр Гoлдун
Отдельный механизм блокирования. Например таблица блокировок и процедура
типа LockObject(ObjType, ObjId), которая либо заносит блокировку, либо
ругается, что такая уже есть. Делается элементарнейше!

Я пожалуй попробую сделать именно так.
А что если клиент заблокирует документ и зависнет/отвалится?
...
Рейтинг: 0 / 0
11.03.2005, 09:15
    #32954726
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Ну войдет клиент заново и снимет блокировку. Надо предусмотреть возможность, чтобы блокировку мог снять либо ее автор, либо администратор системы.
...
Рейтинг: 0 / 0
11.03.2005, 10:39
    #32954935
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Тут ответ на ваш вопрос:
ADO & SQL Server , блокировка записей
авторА что если клиент заблокирует документ и зависнет/отвалится?
И на этот тоже.


-- Tygra's --
...
Рейтинг: 0 / 0
11.03.2005, 10:41
    #32954941
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Ну и конечно транзакции нужно делать как можно менее короткими. А лучше их с клиента вообще не открывать по возможности.

-- Tygra's --
...
Рейтинг: 0 / 0
11.03.2005, 10:46
    #32954959
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
А откуда их открывать, скажите плиз?По поводу коротких - это у Вас в MS SQL.Транзакция должна быть сколь угодно нужной. Надеюсь, мы с Вами не путаем транзакцию в БД и бизнес-транзакцию?!
...
Рейтинг: 0 / 0
11.03.2005, 11:20
    #32955075
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
авторГоворят - это лучше, но как тогда дать другому понять, что документ занят? Мы как раз блокируем его в транзакции.
Ужас ! Мазохизм и извращение !
Не знаете как дать понять, что документ занят ? Дык сто раз уже обсосали эту тему !
Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ : "Редактируй".
Если док. уже редактируется, то пр-ра возвращает "занято таким-то". По выходу из док-та выз. пр-ра для очистки Вас из списка. В этой же пр-ре очищаются все записи у кот. процессы не существуют на данный момент т.е. отвалившиеся пользователи. Всё просто реализуется и всё быстро и надёжно работает. Не мешает просто просматривать редактируемый д-т. Легко переделать под полную монополию на д-т.
...
Рейтинг: 0 / 0
11.03.2005, 11:48
    #32955192
Vadim_Maximov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
LSV авторГоворят - это лучше, но как тогда дать другому понять, что документ занят? Мы как раз блокируем его в транзакции.
Ужас ! Мазохизм и извращение !
Не знаете как дать понять, что документ занят ? Дык сто раз уже обсосали эту тему !
Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ : "Редактируй".
Если док. уже редактируется, то пр-ра возвращает "занято таким-то". По выходу из док-та выз. пр-ра для очистки Вас из списка. В этой же пр-ре очищаются все записи у кот. процессы не существуют на данный момент т.е. отвалившиеся пользователи. Всё просто реализуется и всё быстро и надёжно работает. Не мешает просто просматривать редактируемый д-т. Легко переделать под полную монополию на д-т.
Тяжело приходится людям, у которых нет select for update nowait...
Приходится фактически реализовывать PMON
...
Рейтинг: 0 / 0
11.03.2005, 11:59
    #32955237
Marat_L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
LSVУжас ! Мазохизм и извращение !
Не знаете как дать понять, что документ занят ? Дык сто раз уже обсосали эту тему !
Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ : "Редактируй".
Если док. уже редактируется, то пр-ра возвращает "занято таким-то". По выходу из док-та выз. пр-ра для очистки Вас из списка. В этой же пр-ре очищаются все записи у кот. процессы не существуют на данный момент т.е. отвалившиеся пользователи. Всё просто реализуется и всё быстро и надёжно работает. Не мешает просто просматривать редактируемый д-т. Легко переделать под полную монополию на д-т.

Спасибо - это то что мне нужно!!!
...
Рейтинг: 0 / 0
11.03.2005, 12:10
    #32955277
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Vadim_MaximovТяжело приходится людям, у которых нет select for update nowait...
Приходится фактически реализовывать PMON
Гм, вроде как разговор идет о том, чтобы запретить пользователю открыть для изменения документ, который в это время изменяется другим пользователем. То есть если мы повесим шаред-блокировку, то считать и открыть для изменения его можно будет. Если эклюзивную, то все пользователи, которые бы просто хотели сделать отчет по данным запнуться на этом документе, хотя он вроде бы пока только изменяется на клиенте и в БД изменения не подтверждены. Так что обьясните пожалуйста, чем "select for update nowait" может помочь обойти вышеперечисленные условия и ограничения ?
...
Рейтинг: 0 / 0
11.03.2005, 12:25
    #32955343
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Да ничего они не загнутся. SELECT нормально отработает.Просто в данной вещи select for update не нужен, как я уже говорил, у нас случай транзакции бизнес-уровня. Документ можно заблокировать дня так на 2 и коннект то для этого не надо держать.
...
Рейтинг: 0 / 0
11.03.2005, 12:27
    #32955350
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
select for update и есть shared-блокировка, тем более в Оракле без желания нет блокировок по чтению.
...
Рейтинг: 0 / 0
11.03.2005, 12:28
    #32955360
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
то все пользователи, которые бы просто хотели сделать отчет по данным запнуться на этом документе

Если конкретно по Oracle, то там "писатели" не мешают "читателям". "Читатели" просто видят старую версию из UNDO
...
Рейтинг: 0 / 0
11.03.2005, 12:32
    #32955376
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Shtockselect for update и есть shared-блокировка, тем более в Оракле без желания нет блокировок по чтению.

Не совсем так. При операциях UPDATE (в том числе и SELECT FOR UPDATE) на строку накладывается эксклюзивная блокировка, а на таблицу - shared. А для бизнес-блокировки на несколько дней можно ведь использовать и поле статуса документа
...
Рейтинг: 0 / 0
11.03.2005, 13:35
    #32955586
Vadim_Maximov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
ASCRUS Vadim_MaximovТяжело приходится людям, у которых нет select for update nowait...
Приходится фактически реализовывать PMON
Гм, вроде как разговор идет о том, чтобы запретить пользователю открыть для изменения документ, который в это время изменяется другим пользователем. То есть если мы повесим шаред-блокировку, то считать и открыть для изменения его можно будет. Если эклюзивную, то все пользователи, которые бы просто хотели сделать отчет по данным запнуться на этом документе, хотя он вроде бы пока только изменяется на клиенте и в БД изменения не подтверждены. Так что обьясните пожалуйста, чем "select for update nowait" может помочь обойти вышеперечисленные условия и ограничения ?
Поясняю: если при открытии документа блокировать его через select for update nowait , то при при открытии этого же документа следующим пользователем (и соответственно попытке блокирования его), второй пользователь получит отлуп. А приложению останется просто правильно обработать исключение.
При этом простые селекты по данному документу спокойно считают старые версии блоков из UNDO.
...
Рейтинг: 0 / 0
16.03.2005, 10:02
    #32962356
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Marat_L
А говорят - как-то можно открывать транзакцию только в момент сохранения документа. Пока документ просто открыт - никаких транзакций нет.


Ага, "Мама, а говорят, есть такие червячки, которые в яблоках живут, это правда ?"

Marat_L
Говорят - это лучше, но как тогда дать другому понять, что документ занят?


А никак. Зачем это нужно вообще ? FoxPro с клиппером покоя не дают ?

Marat_L
Мы как раз блокируем его в транзакции.


Не, ну если у вас Interbase или Oracle - пожалуйста, кто ж мешает.
...
Рейтинг: 0 / 0
16.03.2005, 10:11
    #32962382
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Marat_L LSV
Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ
...

Спасибо - это то что мне нужно!!!


Я полагаю, что это - именно то, что тебе ( и большинству других) АБСОЛЮТНО НЕ НУЖНО. Это вообще никому не нужно.
...
Рейтинг: 0 / 0
16.03.2005, 11:25
    #32962674
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Самое правильно на мой взгляд решение таких проблем сделано в PowerBuilder. Для изменяемых и удаляемых записей там можно поставить генерить UPDATE и DELETE в разделе WHERE не только по ключевому полю, но и по всем (перечисленным) полям. В итоге например, после изменения записи PB генерит примерно такой запрос:
Код: plaintext
1.
2.
UPDATE Table
SET Field = :New_FieldValue
WHERE ID = :Original_ID AND Field = :Old_FieldValue
а далее проверяет @@ROWCOUNT и если она не равна единице, генерирует ошибку о том, что сохраняемая запись не соответствует записи в базе данных, т.е. возможно была изменена или удалена другим пользователем. IMHO такой подход более правильный, чем попытка какой либо блокировки записей при изменении их на клиенте, что изначально противоречит парадигмам разработки клиент-серверных приложений.
...
Рейтинг: 0 / 0
16.03.2005, 11:29
    #32962689
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
ASCRUS

Это есть optimistic locking. Реализовано почти где угодно и лучше не через все поля, а через одно - timestamp
...
Рейтинг: 0 / 0
16.03.2005, 11:36
    #32962719
Sergey_SK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
to ASCRUS
это решение не совсем той проблемы о которой реч.
Поясню примером:
Чел открыл счёт чтобы проверить его и принять оплату, открыл и ушёл пить чай. Пока он пил чай ему в счёт ещё с пол сотни позиций добавили.
Пришёл он и жмёт оплата принята, а счёт то уже не тот.
...
Рейтинг: 0 / 0
16.03.2005, 12:56
    #32963098
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
Sergey_SKto ASCRUS
это решение не совсем той проблемы о которой реч.
Поясню примером:
Чел открыл счёт чтобы проверить его и принять оплату, открыл и ушёл пить чай. Пока он пил чай ему в счёт ещё с пол сотни позиций добавили.
Пришёл он и жмёт оплата принята, а счёт то уже не тот.
Кто же мешает в клиент сделать проверку перед принятием оплаты состояния счета между открытыми на клиенте данными и существующими на сервере с выдачей предупреждения об изменениях на сервере и перечитыванием актуальных данных ?
...
Рейтинг: 0 / 0
16.03.2005, 13:44
    #32963303
Sergey_SK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгие транзакции - Короткие транзакции
to ASCRUS
Я вот тоже так думаю, это будет лучше чем открывать транзакцию при открытии документа и закрывать при его закрытии.
Только вот документы могут быть уж очень не простыми и лучше
завести таблицу:
IDДокумента uniqueidentifier
IDСостояния uniqueidentifier
Менять IDСостояния при каждом изменениии документа и по этой ментке ориентироваться устарел открытый документ у клиента или нет.

MasterZiv
Я полагаю, что это - именно то, что тебе ( и большинству других) АБСОЛЮТНО НЕ НУЖНО. Это вообще никому не нужно.

to MasterZiv
ваши предложения?
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Долгие транзакции - Короткие транзакции / 25 сообщений из 62, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]