Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Господа, у кого-то есть идея как сделать критическую секцию или мьютекс на уровне SQL?

Основная проблема, которую тут надо решить -- это как отпустить мьютекс, если сессия убита или упала по ошибке, в том числе фатальной.

Говоря проще, надо обеспечить, чтобы определённый код, например хранимая процедура, не мог выполняться более чем в одной сессии.

Для правки.

Критическая секция (англ. critical section) — объект синхронизации потоков, позволяющий предотвратить одновременное выполнение некоторого набора операций (обычно связанных с доступом к данным) несколькими потоками. Критическая секция выполняет те же задачи, что и мьютекс.
Между мьютексом и критической секцией есть терминологические различия, так процедура, аналогичная захвату мьютекса, называется входом в критическую секцию (англ. enter), снятию блокировки мьютекса — выходом из критической секции (англ. leave).
15 апр 15, 18:43    [17520200]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
app locks же.
15 апр 15, 18:50    [17520221]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Гавриленко Сергей Алексеевич
app locks же.


Не понял
15 апр 15, 19:13    [17520319]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7587
a_voronin,

не тупи
+
sp_getapplock
15 апр 15, 19:16    [17520328]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
a_voronin
Гавриленко Сергей Алексеевич
app locks же.


Не понял
http://lmgtfy.com/?q=mssql app locks
15 апр 15, 19:17    [17520331]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Crimean
Member

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

так транзакции и блокировки же..
15 апр 15, 19:34    [17520385]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Хорошо, как действовать при таком раскладе -- два окна.

К сообщению приложен файл. Размер - 28Kb
15 апр 15, 19:34    [17520386]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
a_voronin
Хорошо, как действовать при таком раскладе -- два окна.


Если кто не заметил, в первом окне отменил после 5 секунд. Второй не может захватить ресурс на 33 секунде.

Затем валиться по

Msg 1223, Level 16, State 1, Procedure xp_userlock, Line 1
Cannot release the application lock (Database Principal: 'public', Resource: 'MyLock') because it is not currently held.
15 апр 15, 19:36    [17520397]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
BEGIN TRAN 

EXEC sp_getapplock  @Resource = 'MyLock', @LockMode =  'Exclusive', @LockTimeout = 30000 

WAITFOR DELAY '00:00:10'

EXEC sp_releaseapplock @Resource = 'MyLock'
     
COMMIT TRAN 
15 апр 15, 19:38    [17520409]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Crimean
Member

Откуда:
Сообщений: 13147
a_voronin
Хорошо, как действовать при таком раскладе


у нормального приложения (а не у квери) первой коннект сделает rollback или закроет коннект
15 апр 15, 19:55    [17520444]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Так тоже не канает? У кого мудрые мысли есть?

К сообщению приложен файл. Размер - 44Kb
15 апр 15, 20:04    [17520476]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
a_voronin
Если кто не заметил, в первом окне отменил после 5 секунд. Второй не может захватить ресурс на 33 секунде.
set xact_abort on поставьте. Тогда при отмене транзакция откатится.
15 апр 15, 20:20    [17520550]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
invm,

Да так канает

К сообщению приложен файл. Размер - 46Kb
15 апр 15, 20:24    [17520569]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35381
Блог
a_voronin,

зачем ЭТО в хранилище?
15 апр 15, 21:09    [17520705]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Критик
a_voronin,

зачем ЭТО в хранилище?


Нужно чтобы пока работает полный апдейт, инкрементальный у него под ногами не путался. При этом, чтоб как полный закончился инкрементальный регулярно бы запускался.
15 апр 15, 22:06    [17520877]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
o-o
Guest
+

ето у них самодельный MERGE REPLICATION сбоит
Картинка с другого сайта.

извините,
самоудаляюсь
15 апр 15, 22:31    [17520962]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35381
Блог
a_voronin,

1) попробовать в ваш алгоритм интегрировать подсказку READPAST
2) на SSIS-пакете сделать последовательный запуск
15 апр 15, 23:46    [17521100]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Критик
a_voronin,

1) попробовать в ваш алгоритм интегрировать подсказку READPAST
2) на SSIS-пакете сделать последовательный запуск



Все гораздо сложнее, и затрагивает запросы не только на SQL Server. Речь идёт о целой куче пакетов, командах обновления и синхронизации кубов, NLB и ещё много о чём.
16 апр 15, 14:36    [17524270]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Критик
a_voronin,

1) попробовать в ваш алгоритм интегрировать подсказку READPAST
2) на SSIS-пакете сделать последовательный запуск


Поставим вопрос так две джобы, два чёрных ящика. Мы не знаем что там.

1) Если джоба А работает, джоба Б не должна запускаться или должна ждать.
2) Если джоба А не работает, то джоба Б должна запускаться регулярно.

Джоба А работает 7-10 часов. Джоба Б 1-1.5 часа.
16 апр 15, 14:38    [17524297]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
Поставим вопрос так две джобы, два чёрных ящика.

Черный ящик означает, что нельзя править джобу или то, что она запускает ?
16 апр 15, 14:40    [17524325]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
a_voronin
Критик
a_voronin,

1) попробовать в ваш алгоритм интегрировать подсказку READPAST
2) на SSIS-пакете сделать последовательный запуск


Поставим вопрос так две джобы, два чёрных ящика. Мы не знаем что там.

1) Если джоба А работает, джоба Б не должна запускаться или должна ждать.
2) Если джоба А не работает, то джоба Б должна запускаться регулярно.

Джоба А работает 7-10 часов. Джоба Б 1-1.5 часа.


а нельзя использовать какие-нибудь семафоры (например табличку с флагами запуска), которые бы включались/выключались во время работы A и которые бы чекал Б ?
16 апр 15, 14:46    [17524397]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а нельзя все в одну джобу? разными степами. и пусть джоба сама решает какой степ запускать. а джоба дважды не запускается.
16 апр 15, 14:49    [17524446]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
a_voronin
Поставим вопрос так две джобы, два чёрных ящика.

Черный ящик означает, что нельзя править джобу или то, что она запускает ?


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

Также черный ящик может отвалиться неизвестным нам способом по неизвестной нам причине, а наша логика мьютексов должна работать.
16 апр 15, 16:39    [17525259]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Crimean
а нельзя все в одну джобу? разными степами. и пусть джоба сама решает какой степ запускать. а джоба дважды не запускается.


Там и так уже есть пакеты, которые запускают другие пакеты.
16 апр 15, 16:41    [17525267]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать Критическую секцию на уровне SQL SERVER  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
отя мы можем что-то сделать в начале и в конце этого черного ящика.

и что мешает тогда первым шагом джоба поставить проверку статуса другого джоба ? с несколькими попытками повтора для ошибки через какой-то интервал ?
16 апр 15, 16:46    [17525321]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить