powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поговорим о блокировках
10 сообщений из 10, страница 1 из 1
Поговорим о блокировках
    #34662420
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сильно не пинайте только...
Хотелось бы разобраться с блокировками в PostgreSQL и провести некоторую аналогию с MS SQL
То что блокировки у них реалезованы поразному - это я уже понял. Что такое версионник и блокировочник тоже уяснил. Но есть несколько вопросов, постараюсь высказаться поконкретнее.

Принудительные блокировки в MS SQL делаются через так называемые подсказки в операторах SELECT INSERT UPDATE и DELETE. В частности имеем запрос (все запросы - реальные, из 1С 7.7):

Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK)

Из таблицы этот SELECT ничего не выберает, но MS SQL перед выполнением самого SELECT выполнит блокировку таблицы TABLOCKX HOLDLOCK, которая благодаря слову HOLDLOCK продержится до конца транзакции.
Сей запрос можно легко преобразовать в следующее (ой поправьте меня если не прав):

бла-бла-бла-объявление функции
LOCK _1SCONNECT IN ACCESS EXCLUSIVE MODE

поскольку SELECT не делает ничего, это будет работать.
Дальше веселее:

Create procedure _1sp__1SUSERS_TLock AS
set nocount on declare @i integer select @i=1 from _1SUSERS(TABLOCK HOLDLOCK) where 0=1

Великий смысл объявления локальной переменной @i я так и не понял, а вот where 0=1 обычно делается, чтобы никакой SELECT не выполнялся вообще. Сия конструкция мною так же заменяется на:

LOCK _1SUSERS IN ACCESS EXCLUSIVE MODE

Вопрос - сохранится ли блокировка таблицы после выхода из этой функции, если функция вызывается внутри транзакции? И вообще на сколько это правильно, ведь речь идет уже о TABLOCK, а не TABLOCKX.

И наконец, самое инетерсное:

select @i=MAX(ROW_ID) from _1SCONST(NOLOCK)

Здесь мы имеем дело уже с реальным SELECT, который вытаскивает данные из _1SCONST, а условие (NOLOCK) говорит, что данные надо брать даже если таблица залочена (могут попасться и промежуточные данные чужих транзакций), и вот никак не могу понять, на что поменять сей запрос в PostgreSQL.
Исходники 1С и структуру базы я естесственно не могу менять, в моих руках только подмена SQL запросов.
И вообще, где можно наиболее объемно почитать про ПРИНУДИТЕЛЬНЫЕ блокировки в PostgreSQL, и про SELECT FOR UPDATE в частности, даже в английской документации ничего внятного не нашел пока что.

Заранее всем благодарен!
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34663291
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В документации
12.3. Explicit Locking
reference/sql commands/SELECT
reference/sql commands/LOCK
reference/sql commands/SET TRANSACTION
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34663653
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых - спасибо за ссылку на документацию, кое что понял.

Во-вторых, поделюсь тем что мне уже подсказали по почте (Николай, большое спасибо!)

Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK)
соответствует
LOCK _1SCONNECT IN ACCESS EXCLUSIVE MODE

select @i=1 from _1SUSERS(TABLOCK HOLDLOCK) where 0=1
правильно будет
LOCK _1SUSERS IN EXCLUSIVE MODE

select @i=MAX(ROW_ID) from _1SCONST(NOLOCK)
в данном конкретном случае можно заменить просто на
select @i=MAX(ROW_ID) from _1SCONST
Причем мне пообещали, что с функцией MAX я еще попарюсь :)

Но давайте усложним задачу:
Допустим имеем запрос
select @i=MAX(ROW_ID) from _1SCONST(TABLOCKX HOLDLOCK)
и заранее нам не известно, будет он выполнятся внутри транзакции, или без.
Если транзакция открыта, то этот запрос можно заменить на две строчки:
LOCK _1SCONNECT IN ACCESS EXCLUSIVE MODE;
select @i=MAX(ROW_ID) from _1SCONST
А если транзакции нет? Блокировка в PostgreSQL ведь не выполнится, как быть?
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34663681
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12.3.4. Advisory Locks ?
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34663846
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оу, моя документация заканчивалась на пункте 12.3.3, пришлось поискать более свежие ссылки :)
Большое Вам спасибо за этот пунктик!
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34663995
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg12.3.4. Advisory Locks ?

Я бы не советовал.

Advisory locks нетранзакционные, а автор топика пытается воспроизводить транзакционные блокировки MS SQL.

По концу транзакции придется все удалять удалять руками.
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34664008
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zashibis
А если транзакции нет? Блокировка в PostgreSQL ведь не выполнится, как быть?

Очень просто быть.

Радоваться: под MS SQL, насколько я понимаю, никакой блокировки тоже не будет.
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34664091
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Радоваться: под MS SQL, насколько я понимаю, никакой блокировки тоже не будет.

Следующий запрос
Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK)
выполняется в 1С без открытия транзакции, это однозначно. Что же это, глюк от разработчиков 1С? А через некоторое время они выполняют
Select 1 from _1SCONNECT(NOLOCK)
Если это и правда их бага, то я буду бесконечно счастлив, во время этих запросов база открыта в монопольном режиме (конфигуратор в 1С) и паралельных запросов все равно нет.


>> По концу транзакции придется все удалять удалять руками.

Гораздо хуже: мне придется следить, была ли открыта транзакция и в зависимости от этого выполнять либо LOCK, либо Advisory Locks.
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34664293
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята из соседнего раздела сказали, что
Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK)
без предварительного открытия транзакции есть не что иное как глюк от разработчиков 1С
Радуюсь жизни, как посоветовал ilejn

Всем большое спасибо, топик Close
...
Рейтинг: 0 / 0
Поговорим о блокировках
    #34664692
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZashibisРебята из соседнего раздела сказали, что
Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK)
без предварительного открытия транзакции есть не что иное как глюк от разработчиков 1С


Ребята сказали неправильно (никакой это не глюк: просто есть некий код, который может быть вызван как вне транзакции, так и в транзакции), но это не должно мешать твоей радости.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поговорим о блокировках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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