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


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

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

Как реализовать такой мьютекс, может у кого есть такие мысли?
...
Рейтинг: 0 / 0
Как реализовать mutex?
    #39991622
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как реализовать mutex?
    #39991635
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как реализовать mutex?
    #39991637
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как реализовать mutex?
    #39991644
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как реализовать mutex?
    #39991648
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, так, получается, достаточно лока на 1 ресурс (а)?

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

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


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