Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
Сильно не пинайте только... Хотелось бы разобраться с блокировками в 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 в частности, даже в английской документации ничего внятного не нашел пока что. Заранее всем благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2007, 19:35 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
В документации 12.3. Explicit Locking reference/sql commands/SELECT reference/sql commands/LOCK reference/sql commands/SET TRANSACTION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 11:08 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
Во-первых - спасибо за ссылку на документацию, кое что понял. Во-вторых, поделюсь тем что мне уже подсказали по почте (Николай, большое спасибо!) 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 ведь не выполнится, как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 12:31 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
12.3.4. Advisory Locks ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 12:35 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
Оу, моя документация заканчивалась на пункте 12.3.3, пришлось поискать более свежие ссылки :) Большое Вам спасибо за этот пунктик! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 13:18 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
st_serg12.3.4. Advisory Locks ? Я бы не советовал. Advisory locks нетранзакционные, а автор топика пытается воспроизводить транзакционные блокировки MS SQL. По концу транзакции придется все удалять удалять руками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 13:44 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
Zashibis А если транзакции нет? Блокировка в PostgreSQL ведь не выполнится, как быть? Очень просто быть. Радоваться: под MS SQL, насколько я понимаю, никакой блокировки тоже не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 13:46 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
>> Радоваться: под MS SQL, насколько я понимаю, никакой блокировки тоже не будет. Следующий запрос Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK) выполняется в 1С без открытия транзакции, это однозначно. Что же это, глюк от разработчиков 1С? А через некоторое время они выполняют Select 1 from _1SCONNECT(NOLOCK) Если это и правда их бага, то я буду бесконечно счастлив, во время этих запросов база открыта в монопольном режиме (конфигуратор в 1С) и паралельных запросов все равно нет. >> По концу транзакции придется все удалять удалять руками. Гораздо хуже: мне придется следить, была ли открыта транзакция и в зависимости от этого выполнять либо LOCK, либо Advisory Locks. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 14:04 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
Ребята из соседнего раздела сказали, что Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK) без предварительного открытия транзакции есть не что иное как глюк от разработчиков 1С Радуюсь жизни, как посоветовал ilejn Всем большое спасибо, топик Close ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 14:41 |
|
||
|
Поговорим о блокировках
|
|||
|---|---|---|---|
|
#18+
ZashibisРебята из соседнего раздела сказали, что Select 1 from _1SCONNECT(TABLOCKX HOLDLOCK) без предварительного открытия транзакции есть не что иное как глюк от разработчиков 1С Ребята сказали неправильно (никакой это не глюк: просто есть некий код, который может быть вызван как вне транзакции, так и в транзакции), но это не должно мешать твоей радости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2007, 16:08 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34664293&tid=2005267]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 300ms |

| 0 / 0 |
