powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Блокировка записей на чтение.
18 сообщений из 18, страница 1 из 1
Блокировка записей на чтение.
    #39901538
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,
что-то не могу найти решение. Есть таблица, из неё могут читать одновременно несколько транзакций. Допустим во всех транзакциях выполняется

Код: sql
1.
select top(10) * from table1



Так вот надо чтобы каждая транзакция пропускала те строки, которые в данный момент попали в выборку других транзакций (которые ещё не закоммичены). То есть если одна транзакция выбрала свой top(10) записей то она их блокирует таким образом что другие транзакции их пропускают, выбирая свой top(10).
Такое возможно вообще?
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39901564
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis,

WITH (READPAST)

Только с изоляцией снапшотов будут проблемы.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39901595
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis,

делайте апдейт, а потом уже селект.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39901681
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis,

Код: sql
1.
select top(10) * from table1 with (updlock, readpast)
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902261
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

а где holdlock, begin tran, commit?
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902416
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerros
а где holdlock, begin tran, commit?
Holdlock зачем?
А где begin tran и commit - спрашивайте у ТС
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902934
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerros, да, я тоже к этому пришёл, спасибо.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902935
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mind
rigor mortis,

WITH (READPAST)

Только с изоляцией снапшотов будут проблемы.


поясните пожалуйста что за снапшоты?
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902942
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis
Mind
rigor mortis,

WITH (READPAST)

Только с изоляцией снапшотов будут проблемы.


поясните пожалуйста что за снапшоты?


уровень изоляции моментальных снимков. READPAST работает только на уровнях READ COMMITTED и REPEATABLE READ.
подробнее можете прочитать в справке.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902947
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis
да, я тоже к этому пришёл, спасибо.
Правильно. Пускай конкурирующие транзакции ждут.
Да и про update в условиях ни слова. И как потом прочитать ровно то, что было проапдейчено тоже не важно.

Вообще, при таком раскладе, делают примерно так:
Код: sql
1.
2.
3.
4.
update top (...) table1 with (readpast)
set ...
output ...
where ...
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902971
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Вообще, при таком раскладе, делают примерно так:
Код: sql
1.
2.
3.
4.
update top (...) table1 with (readpast)
set ...
output ...
where ...

не уверен, не может случиться что два потока одну и ту же запись обновят по очереди?
по-моему, так надёжней:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @this uniqueidentifier = newid()
--быстро забираем себе какую-нибудь запись из очереди
begin tran
update top(...) queue set thread = @this, status = 0 --in progress
where thread = null
  and ...
order by ...
commit

--теперь можно не торопиться
select * from queue where this = @a and status = 0 --результат может быть пустым
...
...
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902977
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerros
invm
Вообще, при таком раскладе, делают примерно так:
Код: sql
1.
2.
3.
4.
update top (...) table1 with (readpast)
set ...
output ...
where ...

не уверен, не может случиться что два потока одну и ту же запись обновят по очереди?
по-моему, так надёжней:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @this uniqueidentifier = newid()
--быстро забираем себе какую-нибудь запись из очереди
begin tran
update top(...) queue set thread = @this, status = 0 --in progress
where thread = null
  and ...
order by ...
commit

--теперь можно не торопиться
select * from queue where this = @a and status = 0 --результат может быть пустым
...
...



а где в вашем примере выполнение требования которое хотел ТС? у вас сформируется очередь из писателей приэтом блокировки будут неизбежны.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39902999
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerros
не уверен, не может случиться что два потока одну и ту же запись обновят по очереди?
Когда все конкурирующие обновлятели с readpast?
Есть репро? Или, хотя бы, сможете объяснить как такое возможно?
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39903002
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С обновлением по очереди всё нормально. После обновления в строке устанавливается поле read=true, а обновлять транзакция может только если read=false.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39903010
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis
С обновлением по очереди всё нормально. После обновления в строке устанавливается поле read=true, а обновлять транзакция может только если read=false.
Интересно, вы хоть понимаете, что все конкурирующие транзакции с таким же действием (set read=true) выстроятся в очередь?
Судя по всему - нет. Иначе давно бы уже потратили пару минут своего драгоценного времени на чтение документации по readpast.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39906408
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerros
invm
Вообще, при таком раскладе, делают примерно так:
Код: sql
1.
2.
3.
4.
update top (...) table1 with (readpast)
set ...
output ...
where ...

не уверен, не может случиться что два потока одну и ту же запись обновят по очереди?
по-моему, так надёжней:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @this uniqueidentifier = newid()
--быстро забираем себе какую-нибудь запись из очереди
begin tran
update top(...) queue set thread = @this, status = 0 --in progress
where thread = null
  and ...
order by ...
commit

--теперь можно не торопиться
select * from queue where this = @a and status = 0 --результат может быть пустым
...
...

А если ваша сессия отвалится не закончив обработку? Не изобретайте велосипед.
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39907399
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mind
Gerros
пропущено...
не уверен, не может случиться что два потока одну и ту же запись обновят по очереди?
по-моему, так надёжней:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @this uniqueidentifier = newid()
--быстро забираем себе какую-нибудь запись из очереди
begin tran
update top(...) queue set thread = @this, status = 0 --in progress
where thread = null 
  and ...
order by ... 
commit

--теперь можно не торопиться
select * from queue where this = @a and status = 0 --результат может быть пустым
...
...

А если ваша сессия отвалится не закончив обработку? Не изобретайте велосипед.



Бреtt
...
Рейтинг: 0 / 0
Блокировка записей на чтение.
    #39907402
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerros,

where thread = null наверно какие-то специальные настройки нужны, чтобы это работало

order by ... а здесь и настройки не помогут, если это T-SQL - нет такого синтаксиса для контструкции Update


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


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