Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поговорим о блокировках / 10 сообщений из 10, страница 1 из 1
16.07.2007, 19:35
    #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
17.07.2007, 11:08
    #34663291
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поговорим о блокировках
В документации
12.3. Explicit Locking
reference/sql commands/SELECT
reference/sql commands/LOCK
reference/sql commands/SET TRANSACTION
...
Рейтинг: 0 / 0
17.07.2007, 12:31
    #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
17.07.2007, 12:35
    #34663681
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поговорим о блокировках
12.3.4. Advisory Locks ?
...
Рейтинг: 0 / 0
17.07.2007, 13:18
    #34663846
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поговорим о блокировках
Оу, моя документация заканчивалась на пункте 12.3.3, пришлось поискать более свежие ссылки :)
Большое Вам спасибо за этот пунктик!
...
Рейтинг: 0 / 0
17.07.2007, 13:44
    #34663995
ilejn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поговорим о блокировках
st_serg12.3.4. Advisory Locks ?

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

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

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

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

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

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


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

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

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


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


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