Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Блокировка записей на чтение. / 18 сообщений из 18, страница 1 из 1
11.12.2019, 22:13
    #39901538
rigor mortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записей на чтение.
Привет,
что-то не могу найти решение. Есть таблица, из неё могут читать одновременно несколько транзакций. Допустим во всех транзакциях выполняется

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



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

WITH (READPAST)

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

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

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

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

WITH (READPAST)

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


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

WITH (READPAST)

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


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


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

Вообще, при таком раскладе, делают примерно так:
Код: sql
1.
2.
3.
4.
update top (...) table1 with (readpast)
set ...
output ...
where ...
...
Рейтинг: 0 / 0
14.12.2019, 02:03
    #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
14.12.2019, 04:34
    #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
14.12.2019, 12:05
    #39902999
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записей на чтение.
Gerros
не уверен, не может случиться что два потока одну и ту же запись обновят по очереди?
Когда все конкурирующие обновлятели с readpast?
Есть репро? Или, хотя бы, сможете объяснить как такое возможно?
...
Рейтинг: 0 / 0
14.12.2019, 12:11
    #39903002
rigor mortis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записей на чтение.
С обновлением по очереди всё нормально. После обновления в строке устанавливается поле read=true, а обновлять транзакция может только если read=false.
...
Рейтинг: 0 / 0
14.12.2019, 13:02
    #39903010
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записей на чтение.
rigor mortis
С обновлением по очереди всё нормально. После обновления в строке устанавливается поле read=true, а обновлять транзакция может только если read=false.
Интересно, вы хоть понимаете, что все конкурирующие транзакции с таким же действием (set read=true) выстроятся в очередь?
Судя по всему - нет. Иначе давно бы уже потратили пару минут своего драгоценного времени на чтение документации по readpast.
...
Рейтинг: 0 / 0
20.12.2019, 23:23
    #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
24.12.2019, 10:58
    #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
24.12.2019, 11:02
    #39907402
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записей на чтение.
Gerros,

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

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


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


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