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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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


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

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


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

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


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

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


Я полагаю, что это - именно то, что тебе ( и большинству других) АБСОЛЮТНО НЕ НУЖНО. Это вообще никому не нужно.
...
Рейтинг: 0 / 0
Долгие транзакции - Короткие транзакции
    #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
Долгие транзакции - Короткие транзакции
    #32962689
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS

Это есть optimistic locking. Реализовано почти где угодно и лучше не через все поля, а через одно - timestamp
...
Рейтинг: 0 / 0
Долгие транзакции - Короткие транзакции
    #32962719
Sergey_SK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to ASCRUS
это решение не совсем той проблемы о которой реч.
Поясню примером:
Чел открыл счёт чтобы проверить его и принять оплату, открыл и ушёл пить чай. Пока он пил чай ему в счёт ещё с пол сотни позиций добавили.
Пришёл он и жмёт оплата принята, а счёт то уже не тот.
...
Рейтинг: 0 / 0
Долгие транзакции - Короткие транзакции
    #32963098
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_SKto ASCRUS
это решение не совсем той проблемы о которой реч.
Поясню примером:
Чел открыл счёт чтобы проверить его и принять оплату, открыл и ушёл пить чай. Пока он пил чай ему в счёт ещё с пол сотни позиций добавили.
Пришёл он и жмёт оплата принята, а счёт то уже не тот.
Кто же мешает в клиент сделать проверку перед принятием оплаты состояния счета между открытыми на клиенте данными и существующими на сервере с выдачей предупреждения об изменениях на сервере и перечитыванием актуальных данных ?
...
Рейтинг: 0 / 0
Долгие транзакции - Короткие транзакции
    #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]