Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Не могу разобраться с блокировками  [new]
BM13
Guest
Добрый день.
Есть бд mssql 2005 и клиентская программа (на delphi) использующая TADOConnection.
При работе допустим 2 пользователей одновременно, при сохранении данных в n одних и техже таблиц - сохранение обернуто в:
IsoLvl:=Connection.IsolationLevel;
Connection.IsolationLevel:= ilReadCommitted;
Connection.BeginTrans;
................................
здесь много инсертов, селектов в разные таблицы
................................
Connection.CommitTrans;
Connection.IsolationLevel:= IsoLvl;

происходит что при старте транзакции у первого второй ничего сохранить не может (истекло время) пока у первого не закончится транзакция с пакетом комманд.
В настройках базы выставил
READ_COMMITTED_SNAPSHOT ON
и
ALLOW_SNAPSHOT_ISOLATION ON
Про блокировки читал. Но пока ничего путного не получилось. Как я понял менеджер блокировок сам выставляет режимы запросов в монопольный когда посчитает нужным. Что нужно (что где указать) чтобы оба пользователя могли писать в одни и теже таблицы паралельно (записи не пересекаются). блокировки вешаются менеджером в том числе и на объект (таблицу) целиком
11 фев 14, 16:49    [15552450]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
И какой именно запрос из "здесь много инсертов, селектов в разные таблицы" у второго ждет "пока у первого не закончится транзакция с пакетом комманд."?
11 фев 14, 16:58    [15552487]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Glory
Member

Откуда:
Сообщений: 104751
BM13
Что нужно (что где указать) чтобы оба пользователя могли писать в одни и теже таблицы паралельно (записи не пересекаются). блокировки вешаются менеджером в том числе и на объект (таблицу) целиком

А зачем вам транзакция на "много инсертов, селектов в разные таблицы" ?
У вас все эти "много инсертов" должны либо все выполниться, либо все не выполниться ?

Сообщение было отредактировано: 11 фев 14, 17:01
11 фев 14, 17:00    [15552506]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
Гавриленко Сергей Алексеевич,
В Managment Studio во время выполнения вижу много таблиц с Монопольными блокировками и Монопольными блокировками намерения. Во многих (почти во всех) тип блокировки на объект. Какой именно не могу сказать. Таблицы и у первого и второго при сохранении используются почти одни и теже.

Glory,
Да, так. Если будет ошибка, чтобы можно было откатить всё разом. В первом случае это цикл по многим документам. Во втором по одному. И второй пока не закончит первый не может сохранить свой один документ.
11 фев 14, 17:10    [15552598]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
BM13
Гавриленко Сергей Алексеевич,
Какой именно не могу сказать.
Запустите Profiler и смогите.
11 фев 14, 17:13    [15552633]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Glory
Member

Откуда:
Сообщений: 104751
BM13
Да, так. Если будет ошибка, чтобы можно было откатить всё разом.

Тогда чему вы удивляетесь ?
Уроень изоляции вы поставили ReadCommitted - коненкт будет ждать пока транзакция ен завершится хоть с каким то результатом

BM13
В первом случае это цикл по многим документам. Во втором по одному. И второй пока не закончит первый не может сохранить свой один документ.

Думайте над уменьшением времени цикла.
11 фев 14, 17:13    [15552634]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
Glory
BM13
Да, так. Если будет ошибка, чтобы можно было откатить всё разом.

Тогда чему вы удивляетесь ?
Уроень изоляции вы поставили ReadCommitted - коненкт будет ждать пока транзакция ен завершится хоть с каким то результатом



BM13
В первом случае это цикл по многим документам. Во втором по одному. И второй пока не закончит первый не может сохранить свой один документ.

Думайте над уменьшением времени цикла.


Цикл ощутимо не уменьшить. И к томуже критично по времени ждать - народ ругается в очереди. И активность в базе приличная.
А какой тогда уровень указать чтобы не блокировать таблицу целиком?
11 фев 14, 17:21    [15552701]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
хмхмхм
Guest
BM13,

настройте трейс с помощью SQL Profiler и посмотрите какой запрос кого блокирует.
11 фев 14, 17:24    [15552736]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
BM13
здесь много инсертов, селектов в разные таблицы
Я правильно понимаю, что в пишущей транзакции вытягиваются какие-то данные на клиента и там обрабатываются, возможно даже интерактивно?
11 фев 14, 17:44    [15552868]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
invm
BM13
здесь много инсертов, селектов в разные таблицы
Я правильно понимаю, что в пишущей транзакции вытягиваются какие-то данные на клиента и там обрабатываются, возможно даже интерактивно?

Да, там не только Insert во много таблиц но и много выборок, так например, данные по клиенту в базе уже есть и надо в определенные таблицы его вписать под новый документ. И там не толко данные по клиенту. Но и есть еще разные проверки на наличие.
Использование ReadUnCommited тоже на создание блокировок не влияет. Как появлялись так и появляются хотя вроде:
READ UNCOMMITTED – незавершенное чтение. Этот уровень гарантирует только физическую целостность данных. В сущности, для транзакции не устанавливается никакая блокировка.
Или я чтото не так понимаю
12 фев 14, 09:19    [15554872]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
BM13
Да, там не только Insert во много таблиц но и много выборок, так например, данные по клиенту в базе уже есть и надо в определенные таблицы его вписать под новый документ. И там не толко данные по клиенту. Но и есть еще разные проверки на наличие.
Жесткач. А в виде хранимых процедур нельзя это было реализовать?

Опцию ALLOW_SNAPSHOT_ISOLATION лучше отключить, она вам не нужна, судя по всему.

Если READ_COMMITTED_SNAPSHOT включена, то ожиданий на чтении обычно не бывает, если конечно вы действительно работаете в ReadCommitted. Значит, разруха в головах писатели блокируют друг друга. Разные коннекты обрабатывают одни и те же записи, да?
12 фев 14, 09:30    [15554903]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
Ennor Tiegael,
блокируют писатели. Так как открытие (N * Select) документа происходит нормально. Но сохранить его пока не закончится пакетный ввод таких же документов в теже таблицы обернутых в одну транзакцию не получается. Причем ввод по одному документу также обернут в единую транзакцию.
Записи разные, таблицы одни и теже. Но они монопольно блокируются как ODJECT.
12 фев 14, 09:43    [15554949]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1213
>А в виде хранимых процедур нельзя это было реализовать?

Присоединюсь к вопросу автора. Ибо не понимаю, как можно в виде ХП реализовать сохранение документа, когда документ состоит из множества Detail записей и все сохранено должно быть в одной транзакции. Приходится все хранить локально и только когда пользователь нажал ОК, отправлять на сервер, запуская транзакцию с клиента
12 фев 14, 10:01    [15555010]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
minva
>А в виде хранимых процедур нельзя это было реализовать?

Присоединюсь к вопросу автора. Ибо не понимаю, как можно в виде ХП реализовать сохранение документа, когда документ состоит из множества Detail записей и все сохранено должно быть в одной транзакции. Приходится все хранить локально и только когда пользователь нажал ОК, отправлять на сервер, запуская транзакцию с клиента

Иммено так и происходит. хП тут не подходит. Сначало все формируется - подготавливается на клиенте затем идет запись в бд по кнопке Сохранить.
12 фев 14, 10:11    [15555051]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
BM13
хП тут не подходит.


а вызвать ХП, передав ей все параметры (по нажатию кнопки юзером) религия не позволяет?
12 фев 14, 10:24    [15555114]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
BM13
Иммено так и происходит. хП тут не подходит. Сначало все формируется - подготавливается на клиенте затем идет запись в бд по кнопке Сохранить.
Любой мастер-деталь, с любым уровнем вложенности и зависимости можно передать в виде XML-параметра. Перейдете на что-нибудь новее, чем 2005 - можно будет еще и табличные параметры заюзать.

Сам в свое время переделывал аналогичный ввод документов в одной системе на XML, ибо тормоза и блокировки были просто адские.

Кроме того, клиентские транзакции - зло, a priori.
12 фев 14, 10:50    [15555275]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
Ennor Tiegael,
Процедура передачи паекта довольно большая и переделка под xml займет очень много времени. Так же как и отладка. Если с блокировками никак не получается, есть идея отказаться от единой транзакции и писать полученные ID головной таблицы в отдельную таблицу. При возникновении ошибки удалять добавленые записи и детали каскадно. FK настроены. Незнаю это вариант или нет?
12 фев 14, 11:17    [15555453]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Я за хранимые процедуры !

Ну или сделать свои транзакции:
В таблицы добавить поле статус записи:
0 - идет процедура генерации,
1 - процедура генерации успешно завершена
2 - запись помечена на удаление

И поле сессии
см. https://www.sql.ru/forum/665241/kak-uznat-id-sessii

Затем (в короткой транзакции) делать массово по таблицам
Update set status=1 where id-sessii=my-sessin and ststus=0
как-то так

И сделать Job по авто-очистке потерянных записей,( когда сессия рухнула ) или помеченных на удаление.
Ну и основное приложение должно использовать в работе только подтвержденные записи со статусом 1

Короче, лучше и проще на хранимки переделать.
12 фев 14, 12:10    [15555957]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
И еще:
я в своих программах не позволяю
клиентскому приложению накапливать большие измененные данные,
да еще со сложной структурой, которую только XML описать можно.

Веду таблицу на сервере, в которой сразу отображается контекст активности пользователя.
После каждого клика пользователя в интерфейсе программы - у меня вызывается хранимка Set_User_Context
В результате на сервере есть информация - в какой программе в какой форме пользователь работает,
какой чекбокс он только что кликнул.

Это и есть вся необходимая информация для работы серверных
хранимок, которые могут генерировать документы и проводки.

В результате - достаточно вызвать хранимку, например GetNewContract - без параметров.
Хранимка в начале своей работы получит инф. о том пользователе, который ее вызвал и программе,
затем сама получит из таблицы контекста все необходимые
для своей работы параметры, вызвав хранимку Get_User_Context.
12 фев 14, 12:28    [15556109]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Побочный эффект:
хранение контекста на сервере позволяет открывать программу
при старте - сразу в той форме и с теми же данными, которые он
вводил в прошлый раз, но не закончив работу выключил программу.
12 фев 14, 12:41    [15556235]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Addx
Member

Откуда:
Сообщений: 957
ART-CODE
И еще:
я в своих программах не позволяю
клиентскому приложению накапливать большие измененные данные,
да еще со сложной структурой, которую только XML описать можно.

Веду таблицу на сервере, в которой сразу отображается контекст активности пользователя.
После каждого клика пользователя в интерфейсе программы - у меня вызывается хранимка Set_User_Context
В результате на сервере есть информация - в какой программе в какой форме пользователь работает,
какой чекбокс он только что кликнул.

Это и есть вся необходимая информация для работы серверных
хранимок, которые могут генерировать документы и проводки.

В результате - достаточно вызвать хранимку, например GetNewContract - без параметров.
Хранимка в начале своей работы получит инф. о том пользователе, который ее вызвал и программе,
затем сама получит из таблицы контекста все необходимые
для своей работы параметры, вызвав хранимку Get_User_Context.


После каждого клика? А на движении мыши?
Что делать, если данные в базе противоречат тому, что пользователь видит?
А если не только галочки ставить надо, а логика посерьезнее?
Я уж не говорю о том, что в постоянном тырканьи в базу нет ничего полезного.
ИМХО, реализовывать интерфейс через ХП - изврат. Это не легкий клиент, а непонятно что.
12 фев 14, 13:24    [15556581]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
BM13
Guest
ART-CODE
И еще:
я в своих программах не позволяю
клиентскому приложению накапливать большие измененные данные,
да еще со сложной структурой, которую только XML описать можно.

Веду таблицу на сервере, в которой сразу отображается контекст активности пользователя.
После каждого клика пользователя в интерфейсе программы - у меня вызывается хранимка Set_User_Context
В результате на сервере есть информация - в какой программе в какой форме пользователь работает,
какой чекбокс он только что кликнул.

Это и есть вся необходимая информация для работы серверных
хранимок, которые могут генерировать документы и проводки.

В результате - достаточно вызвать хранимку, например GetNewContract - без параметров.
Хранимка в начале своей работы получит инф. о том пользователе, который ее вызвал и программе,
затем сама получит из таблицы контекста все необходимые
для своей работы параметры, вызвав хранимку Get_User_Context.

Как это отонсится к теме. Писать каждый кликнутый чек, сомбо, спин в например каждой ноде TcxTreeView - ну как то сомнительно чтобы потом в хп разбирать. Щас например открыли док. чтото изменили, а потом передумали нажали кнопку Отменить и релоадом опять всё востановили в форме из базы. Либо вообще Закрыть и ничего не отправлять. По сохранить либо инсерт либо апдейт. Зачем мен писать всё сразу на сервер то, тем более действия пользователя...
12 фев 14, 13:49    [15556787]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Addx,

автор
если данные в базе противоречат тому, что пользователь видит?

У меня поля с не сохраненными в базе данными (взятыми из контекста) подсвечиваются цветом, не перепутаешь.
И при наличии таких полей появляется кнопка "сохранить изменения".
автор
А если не только галочки ставить надо, а логика посерьезнее

Существует стандартный набор компонентов интерфейса пользователя и события изменения данных в них.
Обрабатываем события, сохраняем, указав имя программы, имя формы и имя компонента.
Можно асинхронно, чтобы интерфейс не тормозил.
Не знаю в чем может быть проблема.
Все работает по такой схеме уже давно, это не теория, а практика.

Про мышку я не писал, что движения сохраняю.
Кому надо - пусть сам думает что с этим делать :)
12 фев 14, 13:51    [15556798]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
автор
Как это отонсится к теме

Был затронут вопрос о сложности передачи параметров хранимке.
Я описал вариант реализации, при котором параметры в момент вызова хранимки передавать вообще не нужно.
Ну и, кроме того: ТС предстоит большая работа по переделке программы,
может быть подумает о таком варианте на будущее.

автор
ткрыли док. чтото изменили, а потом передумали

Не проблема.
У каждого записанного события изменения состояния контрола есть дата/время и идентификатор сессии.
Исходя из этого, можно судить о последовательности действий пользователя и актуальности полученного контекста.
Контекст не ведется как сплошная таблица при помощи Insert и Delete при отмене.
Он ведется при помощи Update, т.е. следующее событие в этой же форме и этом же контроле
у этого пользователя и в этой программе - будет перезаписано новым значением состояния
контрола с пометкой Дата/время, идентификатор сессии.
12 фев 14, 15:05    [15557421]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться с блокировками  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3695
Ничего страшного в открытии/закрытии транзакций на клиенте нет, как и в запросах на клиенте вместо ХП. Но если транзакция длительная, и в ней осуществляются какие-либо чтения, да еще и в цикле, то общих советов тут немного:

1) Вынести все чтения, которые не зависят от промежуточных результатов расчетов наружу, вне транзакции
2) Оптимизировать алгоритм с целью уменьшения количества циклов. Может, у вас там куча вложенных курсоров, никто ведь не знает?
3) Посмотреть наличие индексов и их использование в ваших запросах.

Подход ART-CODE по хранению изменений в БД конечно интересный, но лично мне не нравится. Я бы все-таки не советовал заморачиваться.
12 фев 14, 16:20    [15558054]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить