Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как реализовать mutex? / 8 сообщений из 8, страница 1 из 1
22.08.2020, 11:28
    #39991621
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
Коллеги, приветствую!
Помогите советом, как реализовать mutex?
Пользователи параллельно запускают некий сценарий, состоящий из на набора хранимых процедур. Одна из этих процедур (а) должна выполняться строго монопольно. Т.е. другие аналогичные процедуры (а) других пользователей в этот же момент - недопустимы.
Раньше я реализовывал мьютекс - очень просто. Создал таблицу mutex из одного поля i и из одной записи, и далее, в транзакции,
внутри процедуры, делал:
Код: sql
1.
 Update mutex (Tablock, holdlock, serializable) Set i = 1 


И все было замечательно.
Однако, теперь появился еще один вид хранимых процедур (b)
b - неограниченно совместимы друг с другом, но не совместимы с (а).
(а) - по прежнему не совместимы друг с другом.

Хотелось бы, чтобы (b) множества пользователей выполнялись неограниченно параллельно, но запуск этих процедур был невозможен, пока выполняется хоть одна (a). Запуск (а) тоже НЕ мог бы производиться, пока продолжается выполнение хоть одной (b), или выполняется хоть одна (а).
Ситуация, когда имеется запущенная (b), ожидающая ее окончание (а), и снова запускается (b) отодвигая (а) - допустима (и даже в некоторой степени - желательна).

Как реализовать такой мьютекс, может у кого есть такие мысли?
...
Рейтинг: 0 / 0
22.08.2020, 11:42
    #39991622
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
...
Рейтинг: 0 / 0
22.08.2020, 13:58
    #39991635
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
...
Рейтинг: 0 / 0
22.08.2020, 14:44
    #39991637
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
uaggster,

Ииии? Замечательно. Спасибо.
А дальше?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create or alter procedure [A]
as
if @@OPTIONS & 512 = 0 set nocount on;

exec sp_getapplock N'A', 'Exclusive', 'Session', -1, N'public';
exec sp_getapplock N'B', 'Exclusive', 'Session', -1, N'public';

--do some action
waitfor delay '00:00:10';

exec sp_releaseapplock N'B', 'Session', N'public';
exec sp_releaseapplock N'A', 'Session', N'public';
go

create or alter procedure [B]
as
if @@OPTIONS & 512 = 0 set nocount on;

exec sp_getapplock N'B', 'Shared', 'Session', -1, N'public';

--do some action
waitfor delay '00:00:10';

exec sp_releaseapplock N'B', 'Session', N'public';
go
...
Рейтинг: 0 / 0
22.08.2020, 15:28
    #39991644
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
uaggster
Хотелось бы, чтобы (b) множества пользователей выполнялись неограниченно параллельно, но запуск этих процедур был невозможен, пока выполняется хоть одна (a). Запуск (а) тоже НЕ мог бы производиться, пока продолжается выполнение хоть одной (b), или выполняется хоть одна (а).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create procedure A
as
begin
 exec sp_getapplock N'A', 'Exclusive', 'Session', -1;
 ...
 exec sp_releaseapplock N'A', 'Session';
end;
go

create procedure B
as
begin
 exec sp_getapplock N'A', 'Shared', 'Session', -1;
 ...
 exec sp_releaseapplock N'A', 'Session';
end;
go


ЗЫ: Как по мне, то надежней делать с LockOwner = 'Transaction' и запретить выполнять процедуры вне транзакции.
...
Рейтинг: 0 / 0
22.08.2020, 16:08
    #39991648
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
invm, так, получается, достаточно лока на 1 ресурс (а)?

И, еще, в случае если владелец - транзакция, то sp_releaseapplock - не нужен?
...
Рейтинг: 0 / 0
22.08.2020, 16:25
    #39991649
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
uaggster
invm, так, получается, достаточно лока на 1 ресурс (а)?
Для описанной задачи - да.
uaggster
И, еще, в случае если владелец - транзакция, то sp_releaseapplock - не нужен?
Нужен, если надо будет отпустить ресурс до окончания транзакции.
...
Рейтинг: 0 / 0
22.08.2020, 19:04
    #39991666
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать mutex?
uaggster,

поведение совместимости блокировок приложения полностью соответствует поведению блокировок с аналогичным названием в таблицах.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как реализовать mutex? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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