Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Взаимоблокировки - помогите начинающему / 24 сообщений из 24, страница 1 из 1
05.09.2019, 17:38
    #39858089
Взаимоблокировки - помогите начинающему
День добрый!
Сразу скажу - это мой первый опыт решения проблем с взаимоблокировками... глаза разбегаются в разные стороны :) Прошу снисходительности!

Ситуация выглядит так:
Клиентское приложение (MS ACCESS 2010) запускает на выполнение хранимую процедуру на MS SQL Server 2008 R2

В этой процедуре делается следующее:
delete from dbo._tmp where Пользователь = suser_sname() ;
-- тут куча инструкций которые динамически формируют строку запроса в переменную @SQL
-- сама строка @SQL представляет из себя инструкцию INSERT INTO _tmp(Пользователь, Ключ) SELECT suser_sname(), Ключ FROM Данные
exec(@SQL);

Затем клиентское приложение читает представление в MS SQL.
Строка запроса представления примерно такая: select * from Данные inner join Данные.Ключ = _tmp.Ключ where Пользователь = suser_sname()

Суть всего процесса следующая:
В ACCESS надо передать данные, что бы они там динамически изменялись. Но для каждого запрашивающего пользователя существуют различные ограничения на просмотр тех или иных строк данных. Поэтому предварительно запускается хранимая процедура, которая формирует временную таблицу с ключами записей, которые доступны пользователю. Эта времменная таблица задействована в представлении, которое и читает клиент с условием Пользователь = suser_sname()

Наверняка решение кому-то сильно не понравится. Другого пока не могу придумать в связке с MS ACCESS
Понятное дело, что пользователей много. Часто возникают взаимоблокировки запросов, потому что пользователи уверенно пытаются прочитать и записать данные как во временную таблицу так и в таблицу с данными.

Сам вопрос:
Посоветуйте какие ключи и опции лучше использовать в инструкциях DELETE и INSERT данной ситуации, что бы избежать или минимизировать взаимоблокировки.
Суда по всему блокируются инструкции DELETE и INSERT когда другие пользователи читают представление, основанное на таблице _tmp

Спасибо!
...
Рейтинг: 0 / 0
05.09.2019, 17:43
    #39858092
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Покажите граф взаимоблокировки в виде xml или xdl.
...
Рейтинг: 0 / 0
05.09.2019, 17:44
    #39858094
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Взаимоблокировки -- это когда 1205 ошибка.
А судя по тому, что тут написано, вам в форум по Access разбираться с тем, как он работает с сервером.
...
Рейтинг: 0 / 0
05.09.2019, 18:03
    #39858103
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
...
Рейтинг: 0 / 0
05.09.2019, 18:04
    #39858104
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Можно организовать приблизительно так, как это описано в статье, с помощью функций и представлений.
...
Рейтинг: 0 / 0
05.09.2019, 19:26
    #39858131
Взаимоблокировки - помогите начинающему
Небольшое пояснение: Задача омрачена тем, что нужно не просто организовать разный доступ к записям, а фактически исполняемая процедура - это процедура фильтрации/поиска - т.е. в нее передается множество параметров.


Граф постараюсь отловить завтра
...
Рейтинг: 0 / 0
05.09.2019, 22:26
    #39858168
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Соколов Валерий,

При том количестве данных что вы предоставили вам можно посоветовать только отапливать ошибку 1205 на клиенте и перезапускать процедуру.
...
Рейтинг: 0 / 0
06.09.2019, 09:14
    #39858256
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Соколов Валерий,

я еще так же рекомендую скачать и установить на экземпляр хранимую процедурку sp_WhoIsActive
http://whoisactive.com/downloads/who_is_active_v11_16.zip

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

Не раз спасала
...
Рейтинг: 0 / 0
06.09.2019, 09:17
    #39858257
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
...
Рейтинг: 0 / 0
06.09.2019, 18:00
    #39858587
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Соколов Валерий,

и процедуру не можете изменить?
...
Рейтинг: 0 / 0
06.09.2019, 21:55
    #39858653
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
PsyMisha,

Какое отношение блокировки имеют к дедлокам?
...
Рейтинг: 0 / 0
07.09.2019, 08:18
    #39858687
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
MindPsyMisha,

Какое отношение блокировки имеют к дедлокам?

Блокировки , в конечном итоге - причина deadlock-ов
...
Рейтинг: 0 / 0
07.09.2019, 08:30
    #39858688
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Соколов Валерий,

Тут вообще дебилизм, тут тебе надо сериализовать
руками такие действия, блокировать данные, читать их на клиента, менять, сохранять, затем разблокировать.
Все клиенты при этом должны выстраиваться в очередь на выполнение
таких действий.

Потому что СУБД уже не в состоянии сериализовать это автоматически,
если ты данные копируешь, связь с исходными теряется.


Можно было бы переделать все это на другой сценарий работы,
Взял, забрал данные, а потом вместо delete/insert делаешь их merge с оригинальными данными.
Может это поможет.

Но конечно надо в делали влезать чтобы что-то сказать более детально.


Сейчас можно порекомендовать только полную ручную сериализацию операции.
Блокировка до, выполнение действий, разблокировка после.

Блокировки делаются вручную update ом записи в таблице, где записи всегда есть.

Раз блокировка в аварийных случаях тоже только руками.

Параллельная работа пользователей при этом будет невозможна
...
Рейтинг: 0 / 0
07.09.2019, 08:35
    #39858689
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Соколов Валерий,

Ну и лучше решение р это переделать вообще все,
Аксесс в жопу, делаешь нормальный клиент - сервер,
Без копирования данных пользователи просто из редактируют как им надо.

Это лучший вариант, но тебе он естественно не понравится
...
Рейтинг: 0 / 0
07.09.2019, 09:27
    #39858692
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
MasterZivАксесс в жопу, делаешь нормальный клиент - сервер,


Чтобы написать клиента, сравнимого с Access, - надо очень сильно напрячься.
Ни тебе, ни тредстартеру такое не по силам.

Поэтому не надо на Access пенять, если руки кривые.
...
Рейтинг: 0 / 0
09.09.2019, 12:38
    #39859288
Сруль.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
авторЧасто возникают взаимоблокировки запросов, потому что пользователи уверенно пытаются прочитать и записать данные как во временную таблицу так и в таблицу с
данными.

Было, что-то похожее. Чем похожее?
Нельзя было двум юзерам, одновременно, пулять одну и ту же
процедуру. Там не велась борьба с блокировками-этого требовала постановка задачи.
Я дал решение, которое до сих пор работает(примерно пол-года), один раз, где-то на втором месяце,
дала козла, но об этом позже.
Во первых, ваша таблица не временная, а вспомогательная. Разница ясна, правда.
Я использовал полу-временную: с двумя решётками.
Суть такая, процедура начиналась с проверки, существует ли вспомогательная таблица?
Если да, она уходила в бесконечный while(1=1) где первой командой стоял waitfor,
я тормозил выполнение на 5 мили-секунд, сейчас не помню, этот промежуток получился
эксперементально, снова проверка, если таблицы нет, комманда exit-cиловой выход
из цикла и вперёд-создание таблицы, понеслась алгоритма. Последняя комманда-удаление
вспомогательной таблицы.
С небольшим ожиданием юзеры мирятся до сих пор.
Суть козла была в том, что как-то раз вспом. таблица не стёрлась.
Может килл, может кто-то улучшил процедуру и она перестала работать.
Я с трудом вспомнил о чём речь, нашёл виновницу торжества и удалил.
С тех пор всё тикает.
...
Рейтинг: 0 / 0
09.09.2019, 12:56
    #39859296
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
Сруль.авторЧасто возникают взаимоблокировки запросов, потому что пользователи уверенно пытаются прочитать и записать данные как во временную таблицу так и в таблицу с
данными.

Было, что-то похожее. Чем похожее?
Нельзя было двум юзерам, одновременно, пулять одну и ту же
процедуру. Там не велась борьба с блокировками-этого требовала постановка задачи.
Я дал решение, которое до сих пор работает(примерно пол-года), один раз, где-то на втором месяце,
дала козла, но об этом позже.
Во первых, ваша таблица не временная, а вспомогательная. Разница ясна, правда.
Я использовал полу-временную: с двумя решётками.
Суть такая, процедура начиналась с проверки, существует ли вспомогательная таблица?
Если да, она уходила в бесконечный while(1=1) где первой командой стоял waitfor,
я тормозил выполнение на 5 мили-секунд, сейчас не помню, этот промежуток получился
эксперементально, снова проверка, если таблицы нет, комманда exit-cиловой выход
из цикла и вперёд-создание таблицы, понеслась алгоритма. Последняя комманда-удаление
вспомогательной таблицы.
С небольшим ожиданием юзеры мирятся до сих пор.
Суть козла была в том, что как-то раз вспом. таблица не стёрлась.
Может килл, может кто-то улучшил процедуру и она перестала работать.
Я с трудом вспомнил о чём речь, нашёл виновницу торжества и удалил.
С тех пор всё тикает.
очередной изобретатель sp_getapplock

авторЯ использовал полу-временную: с двумя решётками. ох
...
Рейтинг: 0 / 0
09.09.2019, 23:14
    #39859628
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
TaPaK

авторЯ использовал полу-временную: с двумя решётками. охЧур меня. Сгинь нечистая!
...
Рейтинг: 0 / 0
14.09.2019, 13:24
    #39861899
defragmentator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
aleks222MasterZivАксесс в жопу, делаешь нормальный клиент - сервер,


Чтобы написать клиента, сравнимого с Access, - надо очень сильно напрячься.
Ни тебе, ни тредстартеру такое не по силам.

Поэтому не надо на Access пенять, если руки кривые.

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

PS: А в чём проблема написать клиента на Delphi или C# ?
...
Рейтинг: 0 / 0
14.09.2019, 21:19
    #39861962
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
defragmentatoraleks222пропущено...


Чтобы написать клиента, сравнимого с Access, - надо очень сильно напрячься.
Ни тебе, ни тредстартеру такое не по силам.

Поэтому не надо на Access пенять, если руки кривые.

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

PS: А в чём проблема написать клиента на Delphi или C# ?

Не надо читать надписи на заборах.
...
Рейтинг: 0 / 0
14.09.2019, 23:04
    #39861972
defragmentator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
aleks222defragmentatorпропущено...


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

PS: А в чём проблема написать клиента на Delphi или C# ?

Не надо читать надписи на заборах.

Это документация MS. Если в самописном клиенте можно как угодно управлять блокировками, то в Access вывел на экран табличку - и привет, ждите все, пока я по экрану похожу.

https://support.office.com/ru-ru/article/Свойство-recordlocks-Блокировка-записей-6ca29bbb-8824-4671-8087-97fe0568019a
авторВсе записи в базовой таблице или запросе блокируются, если форма открыта в представлении формы или режиме таблицы, когда просматривается или печатается отчет либо выполняется запрос. Хотя пользователям доступна возможность чтения записей, никто из них не может редактировать, добавлять или удалять записи, пока форма не будет закрыта, печать отчета не будет завершена или выполнение запроса не закончится.
...
Рейтинг: 0 / 0
15.09.2019, 14:30
    #39862007
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
defragmentatoraleks222пропущено...


Не надо читать надписи на заборах.

Это документация MS. Если в самописном клиенте можно как угодно управлять блокировками, то в Access вывел на экран табличку - и привет, ждите все, пока я по экрану похожу.

https://support.office.com/ru-ru/article/Свойство-recordlocks-Блокировка-записей-6ca29bbb-8824-4671-8087-97fe0568019a
авторВсе записи в базовой таблице или запросе блокируются, если форма открыта в представлении формы или режиме таблицы, когда просматривается или печатается отчет либо выполняется запрос. Хотя пользователям доступна возможность чтения записей, никто из них не может редактировать, добавлять или удалять записи, пока форма не будет закрыта, печать отчета не будет завершена или выполнение запроса не закончится.

Научись читать по-ангельски, что-ли.
И заканчивай нести бред.
...
Рейтинг: 0 / 0
15.09.2019, 17:14
    #39862042
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
defragmentatorЭто документация MS. Если в самописном клиенте можно как угодно управлять блокировками, то в AccessВы задаёте вопросы в терминах приложений MS Office, и цитируете документацию оттуда же, на форуме, который к MS Office не имеет никакого отношения.
И ваши "блокировки", "взаимоблокировки" тут воспринимаются совсем по другому.

Конечно, ваши "взаимоблокировки" не имеют никакого отношения к "взаимоблокировкам" в MSSQL; у вас это фичи, механизмы, состояния того клиентского приложения, которым вы пользуетесь (Access), и проблемы с ним следует решать на форуме по этому клиенту.
...
Рейтинг: 0 / 0
15.09.2019, 18:42
    #39862052
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимоблокировки - помогите начинающему
alexeyvgdefragmentatorЭто документация MS. Если в самописном клиенте можно как угодно управлять блокировками, то в AccessВы задаёте вопросы в терминах приложений MS Office, и цитируете документацию оттуда же, на форуме, который к MS Office не имеет никакого отношения.
И ваши "блокировки", "взаимоблокировки" тут воспринимаются совсем по другому.

Конечно, ваши "взаимоблокировки" не имеют никакого отношения к "взаимоблокировкам" в MSSQL; у вас это фичи, механизмы, состояния того клиентского приложения, которым вы пользуетесь (Access), и проблемы с ним следует решать на форуме по этому клиенту.

MS Access клиент именно MS SQL.
И блокировки, которые он использует - это блокировки именно MS SQL.
Только бред "Все записи в базовой таблице или запросе блокируются" не имеет к действительности НИКАКОГО отношения.
MS Access может блокировать все записи "если так пожелает разработчик", но по-умолчанию НИЧЕГО не блокирует.
Именно это и написано в цитируемой ссылке.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Взаимоблокировки - помогите начинающему / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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