powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация доступа к данным
4 сообщений из 4, страница 1 из 1
Синхронизация доступа к данным
    #32065288
Bron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Java можно перед функцией написать synchronized и тем самым гарантировать синхронизацию между двумя потоками работающие с одним набором данных.
Как тоже самое сделать на Transact SQL?

Алгоритм работы процедуры у меня следующий

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select @LastCreateTime = LastCreateTime from Table1 where Id = @Table1Id

declare c cursor for select CreateTime, Value from TableValues where Table1Id = @Table1Id and CreateTime > @LastCreateTime

open c

while  1  =  1  begin
  fetch c into c @CreateTime, @Value
  if @@fetch_status <>  0  
    break
  set @Cost = @Value * @Price
  set @LastCreateTime  = CreateTime

  exec DailyStatAdd @CreateTime, @Cost
end

update Table1 set LastCreateTime = @LastCreateTime where Id = @Table1Id 
close c
...
Рейтинг: 0 / 0
Синхронизация доступа к данным
    #32065306
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В СУБД (не только MSSQL) для этого используются транзакции и блокировки.
...
Рейтинг: 0 / 0
Синхронизация доступа к данным
    #32065318
Bron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вкурсе, что есть транзакции и блокировки;)

Тогда если не сложно прокоментируйте растановку блокировок
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
begin transaction 

select @LastCreateTime = LastCreateTime from Table1 (ROWLOCK) where Id = @Table1Id

 /* во время выполнения процедуры хотелось, что бы вставка записей в TableValues не тормозилась*/ 
declare c cursor for select CreateTime, Value from TableValues (nolock) where Table1Id = @Table1Id and CreateTime > @LastCreateTime


open c

while  1  =  1  begin
  fetch c into c @CreateTime, @Value
  if @@fetch_status <>  0  
    break
  set @Cost = @Value * @Price
  set @LastCreateTime  = CreateTime

 /* а вот здесь, что нужно сделать ?*/ 
  exec DailyStatAdd @CreateTime, @Cost
end

update Table1 set LastCreateTime = @LastCreateTime where Id = @Table1Id 
close c
end transaction
...
Рейтинг: 0 / 0
Синхронизация доступа к данным
    #32065364
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу хочу сказать, что с курсорами работаю очень мало, так что подробно смотрите документацию.

А что означает synchronized - нужно, что-бы в этот код можно было зайти только одному потоку?

Тогда ваш код это делает:
select @LastCreateTime = LastCreateTime from Table1 (ROWLOCK) where Id = @Table1Id
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Синхронизация доступа к данным
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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