Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Параллельное вполнение тригерров  [new]
Leonidv
Member

Откуда: Санкт-Петербург
Сообщений: 5199
Есть два триггера: instead of insert и instead of update. Есть идея использовать их для реализации блокировки. Примерно так в теле триггера:

select @id=id, @limit=limit from t1;
if (@limit+@value > 100)
begin
  rollback;
end;
update t1 set @limit = @limit+value

Вопрос следующий - возможна ситуация, что из-за конкурентнных обращений в итоге t1.limit привысит 100?

И еще вопрос - где у MS описана модель запуска триггеров - последовательно, параллельно?
8 авг 12, 18:43    [12983916]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное вполнение тригерров  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Блокировки чего? Блокировки зачем?

Если вам надо обеспечить limit < 100, повесьте соответствующий constraint на таблицу.
8 авг 12, 19:13    [12984046]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное вполнение тригерров  [new]
Leonidv
Member

Откуда: Санкт-Петербург
Сообщений: 5199
invm,

100 берется из внешней таблицы.
8 авг 12, 20:14    [12984270]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное вполнение тригерров  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Leonidv
update t1 set @limit = @limit+value
Может быть, здесь предполагалось "update t1 set limit = @limit+value" ?

Leonidv
Вопрос следующий - возможна ситуация, что из-за конкурентнных обращений в итоге t1.limit привысит 100?

И еще вопрос - где у MS описана модель запуска триггеров - последовательно, параллельно?
Насколько я понимаю, триггеры в пределах одного соединения с БД выполняются последовательно, а триггеры разных соединений могут выполняться параллельно, если не зависнут на блокировках. Если в триггере поставить update, который ставит монопольную блокировку на модифицированную запись, то если этот же триггер параллельно запустится в другом соединении, он не сможет даже прочитать эту запись, зависнет на select'е, пока первый триггер не отработает.
8 авг 12, 20:18    [12984285]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное вполнение тригерров  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Leonidv
Есть два триггера: instead of insert и instead of update. Есть идея использовать их для реализации блокировки. Примерно так в теле триггера:

select @id=id, @limit=limit from t1;
if (@limit+@value > 100)
begin
  rollback;
end;
update t1 set @limit = @limit+value

Вопрос следующий - возможна ситуация, что из-за конкурентнных обращений в итоге t1.limit привысит 100?

И еще вопрос - где у MS описана модель запуска триггеров - последовательно, параллельно?
Запрос у вас не рабочий, и чего как и зачем вы обновляете тоже нифига не понятно.
А вообще сделайте одним апдейтом, без всяких предварительных проверок, тогда точно не будет конкурентных обновлений.
8 авг 12, 20:43    [12984358]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное вполнение тригерров  [new]
invm
Member

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

100 берется из внешней таблицы.
Это не является препятствием:
+ Пример
use tempdb;
go

create table dbo.Limits (limit_id int not null primary key, limit_Value int null);
go

create function dbo.fnGetLimitValue
(
 @limit_id int
)
returns int
as
begin
 return (select limit_Value from dbo.Limits where limit_id = @limit_id);
end;
go

create table dbo.TestTable (t_id int not null primary key, limit_id int, Value int, check (Value < dbo.fnGetLimitValue(limit_id)));
go

insert into dbo.Limits
values
 (1, 10);
go

insert into dbo.TestTable
values
 (1, 1, 5);
go
 
insert into dbo.TestTable
values
 (2, 1, 11);
go

select * from dbo.TestTable;
go
 
drop table dbo.TestTable;
drop table dbo.Limits;
drop function dbo.fnGetLimitValue;
go
В любом случае, вам нужно сперва ответить на вопрос -- что делать со значениями, если лимит во внешней таблице изменился?
8 авг 12, 20:50    [12984370]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить