Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Вот такая у нас ситуация: Каждый раз пользователь открывая документ начинает транзакцию, закрывая его - завершает транзакцию. Поскольку пользователь может держать документ открытым довольно долго, мы прыгаем/выкручиваемся, чтобы он блокировал при работе как можно меньше записей. А говорят - как-то можно открывать транзакцию только в момент сохранения документа. Пока документ просто открыт - никаких транзакций нет. Говорят - это лучше, но как тогда дать другому понять, что документ занят? Мы как раз блокируем его в транзакции. Поделитесь опытом, если не жалко. :) Жизнь коротка - потерпи немного :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2005, 16:26 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Marat_L пишет: > Каждый раз пользователь открывая документ начинает транзакцию, закрывая > его - завершает транзакцию. Поскольку пользователь может держать > документ открытым довольно долго, Так делать нельзя. > А говорят - как-то можно открывать транзакцию только в момент сохранения > документа. Пока документ просто открыт - никаких транзакций нет. > > Говорят - это лучше, но как тогда дать другому понять, что документ занят? > Мы как раз блокируем его в транзакции. Отдельный механизм блокирования. Например таблица блокировок и процедура типа LockObject(ObjType, ObjId), которая либо заносит блокировку, либо ругается, что такая уже есть. Делается элементарнейше! Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2005, 16:33 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Вообще говоря, как я понимаю, зависит от базы и от бизнес-правил. Например, если Oracle, который блокирует с точностью до 1 строки и при этом другой пользователь НИ В КОЕМ СЛУЧАЕ не должен в это время менять эту строку - тогда можно блокировать в начале транзакции и не заморачиваться с доп. механизмами. Если база блокирует не 1 строку, а, например, целый блок, или если допустимо изменять этот документ другими пользователями, пока данный user редактирует документ - тогда блокировка непосредственно перед записью или наворачивание доп. механизмов над стандартными механизмами самой базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2005, 16:58 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Говорят - это лучше, но как тогда дать другому понять, что документ занят? Занят - для чтения или для записи или для того и для другого? Если последний вариант - то у вас все правильно реализовано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2005, 18:10 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун Отдельный механизм блокирования. Например таблица блокировок и процедура типа LockObject(ObjType, ObjId), которая либо заносит блокировку, либо ругается, что такая уже есть. Делается элементарнейше! Я пожалуй попробую сделать именно так. А что если клиент заблокирует документ и зависнет/отвалится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 08:57 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Ну войдет клиент заново и снимет блокировку. Надо предусмотреть возможность, чтобы блокировку мог снять либо ее автор, либо администратор системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 09:15 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Тут ответ на ваш вопрос: ADO & SQL Server , блокировка записей авторА что если клиент заблокирует документ и зависнет/отвалится? И на этот тоже. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 10:39 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Ну и конечно транзакции нужно делать как можно менее короткими. А лучше их с клиента вообще не открывать по возможности. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 10:41 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
А откуда их открывать, скажите плиз?По поводу коротких - это у Вас в MS SQL.Транзакция должна быть сколь угодно нужной. Надеюсь, мы с Вами не путаем транзакцию в БД и бизнес-транзакцию?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 10:46 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
авторГоворят - это лучше, но как тогда дать другому понять, что документ занят? Мы как раз блокируем его в транзакции. Ужас ! Мазохизм и извращение ! Не знаете как дать понять, что документ занят ? Дык сто раз уже обсосали эту тему ! Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ : "Редактируй". Если док. уже редактируется, то пр-ра возвращает "занято таким-то". По выходу из док-та выз. пр-ра для очистки Вас из списка. В этой же пр-ре очищаются все записи у кот. процессы не существуют на данный момент т.е. отвалившиеся пользователи. Всё просто реализуется и всё быстро и надёжно работает. Не мешает просто просматривать редактируемый д-т. Легко переделать под полную монополию на д-т. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 11:20 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
LSV авторГоворят - это лучше, но как тогда дать другому понять, что документ занят? Мы как раз блокируем его в транзакции. Ужас ! Мазохизм и извращение ! Не знаете как дать понять, что документ занят ? Дык сто раз уже обсосали эту тему ! Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ : "Редактируй". Если док. уже редактируется, то пр-ра возвращает "занято таким-то". По выходу из док-та выз. пр-ра для очистки Вас из списка. В этой же пр-ре очищаются все записи у кот. процессы не существуют на данный момент т.е. отвалившиеся пользователи. Всё просто реализуется и всё быстро и надёжно работает. Не мешает просто просматривать редактируемый д-т. Легко переделать под полную монополию на д-т. Тяжело приходится людям, у которых нет select for update nowait... Приходится фактически реализовывать PMON ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 11:48 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
LSVУжас ! Мазохизм и извращение ! Не знаете как дать понять, что документ занят ? Дык сто раз уже обсосали эту тему ! Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ : "Редактируй". Если док. уже редактируется, то пр-ра возвращает "занято таким-то". По выходу из док-та выз. пр-ра для очистки Вас из списка. В этой же пр-ре очищаются все записи у кот. процессы не существуют на данный момент т.е. отвалившиеся пользователи. Всё просто реализуется и всё быстро и надёжно работает. Не мешает просто просматривать редактируемый д-т. Легко переделать под полную монополию на д-т. Спасибо - это то что мне нужно!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 11:59 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Vadim_MaximovТяжело приходится людям, у которых нет select for update nowait... Приходится фактически реализовывать PMON Гм, вроде как разговор идет о том, чтобы запретить пользователю открыть для изменения документ, который в это время изменяется другим пользователем. То есть если мы повесим шаред-блокировку, то считать и открыть для изменения его можно будет. Если эклюзивную, то все пользователи, которые бы просто хотели сделать отчет по данным запнуться на этом документе, хотя он вроде бы пока только изменяется на клиенте и в БД изменения не подтверждены. Так что обьясните пожалуйста, чем "select for update nowait" может помочь обойти вышеперечисленные условия и ограничения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 12:10 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Да ничего они не загнутся. SELECT нормально отработает.Просто в данной вещи select for update не нужен, как я уже говорил, у нас случай транзакции бизнес-уровня. Документ можно заблокировать дня так на 2 и коннект то для этого не надо держать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 12:25 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
select for update и есть shared-блокировка, тем более в Оракле без желания нет блокировок по чтению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 12:27 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
то все пользователи, которые бы просто хотели сделать отчет по данным запнуться на этом документе Если конкретно по Oracle, то там "писатели" не мешают "читателям". "Читатели" просто видят старую версию из UNDO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 12:28 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Shtockselect for update и есть shared-блокировка, тем более в Оракле без желания нет блокировок по чтению. Не совсем так. При операциях UPDATE (в том числе и SELECT FOR UPDATE) на строку накладывается эксклюзивная блокировка, а на таблицу - shared. А для бизнес-блокировки на несколько дней можно ведь использовать и поле статуса документа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 12:32 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
ASCRUS Vadim_MaximovТяжело приходится людям, у которых нет select for update nowait... Приходится фактически реализовывать PMON Гм, вроде как разговор идет о том, чтобы запретить пользователю открыть для изменения документ, который в это время изменяется другим пользователем. То есть если мы повесим шаред-блокировку, то считать и открыть для изменения его можно будет. Если эклюзивную, то все пользователи, которые бы просто хотели сделать отчет по данным запнуться на этом документе, хотя он вроде бы пока только изменяется на клиенте и в БД изменения не подтверждены. Так что обьясните пожалуйста, чем "select for update nowait" может помочь обойти вышеперечисленные условия и ограничения ? Поясняю: если при открытии документа блокировать его через select for update nowait , то при при открытии этого же документа следующим пользователем (и соответственно попытке блокирования его), второй пользователь получит отлуп. А приложению останется просто правильно обработать исключение. При этом простые селекты по данному документу спокойно считают старые версии блоков из UNDO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2005, 13:35 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Marat_L А говорят - как-то можно открывать транзакцию только в момент сохранения документа. Пока документ просто открыт - никаких транзакций нет. Ага, "Мама, а говорят, есть такие червячки, которые в яблоках живут, это правда ?" Marat_L Говорят - это лучше, но как тогда дать другому понять, что документ занят? А никак. Зачем это нужно вообще ? FoxPro с клиппером покоя не дают ? Marat_L Мы как раз блокируем его в транзакции. Не, ну если у вас Interbase или Oracle - пожалуйста, кто ж мешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 10:02 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Marat_L LSV Ведите отдельную т-цу для списка занятых д-тов. Перед попыткой редактирования д-та запускайте процедуру проверки занятости. Если док. не занят, то пр-ра записывает Вас+№док в список (обязательно с SPID вашего серверного процесса) и возвращает ответ ... Спасибо - это то что мне нужно!!! Я полагаю, что это - именно то, что тебе ( и большинству других) АБСОЛЮТНО НЕ НУЖНО. Это вообще никому не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 10:11 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Самое правильно на мой взгляд решение таких проблем сделано в PowerBuilder. Для изменяемых и удаляемых записей там можно поставить генерить UPDATE и DELETE в разделе WHERE не только по ключевому полю, но и по всем (перечисленным) полям. В итоге например, после изменения записи PB генерит примерно такой запрос: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 11:25 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
ASCRUS Это есть optimistic locking. Реализовано почти где угодно и лучше не через все поля, а через одно - timestamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 11:29 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
to ASCRUS это решение не совсем той проблемы о которой реч. Поясню примером: Чел открыл счёт чтобы проверить его и принять оплату, открыл и ушёл пить чай. Пока он пил чай ему в счёт ещё с пол сотни позиций добавили. Пришёл он и жмёт оплата принята, а счёт то уже не тот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 11:36 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
Sergey_SKto ASCRUS это решение не совсем той проблемы о которой реч. Поясню примером: Чел открыл счёт чтобы проверить его и принять оплату, открыл и ушёл пить чай. Пока он пил чай ему в счёт ещё с пол сотни позиций добавили. Пришёл он и жмёт оплата принята, а счёт то уже не тот. Кто же мешает в клиент сделать проверку перед принятием оплаты состояния счета между открытыми на клиенте данными и существующими на сервере с выдачей предупреждения об изменениях на сервере и перечитыванием актуальных данных ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 12:56 |
|
||
|
Долгие транзакции - Короткие транзакции
|
|||
|---|---|---|---|
|
#18+
to ASCRUS Я вот тоже так думаю, это будет лучше чем открывать транзакцию при открытии документа и закрывать при его закрытии. Только вот документы могут быть уж очень не простыми и лучше завести таблицу: IDДокумента uniqueidentifier IDСостояния uniqueidentifier Менять IDСостояния при каждом изменениии документа и по этой ментке ориентироваться устарел открытый документ у клиента или нет. MasterZiv Я полагаю, что это - именно то, что тебе ( и большинству других) АБСОЛЮТНО НЕ НУЖНО. Это вообще никому не нужно. to MasterZiv ваши предложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2005, 13:44 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=156&tid=1545980]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 412ms |

| 0 / 0 |
