powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Serializable Isolation versus True Serializability
22 сообщений из 22, страница 1 из 1
Serializable Isolation versus True Serializability
    #33040591
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги,

помогите, пожалуйста, придумать пример из какой-нибудь
общепонятной предметной области, иллюстрирующий
аномалию из

http://www.postgresql.org/docs/8.0/static/transaction-iso.html#MVCC-SERIALIZABILITY

Хочется вместо class и value что-нибудь более жизненное, берущее,
я бы сказал, за душу.

Есть похожий пример, где одна транзакция удаляет родителя, потому
что у него нет ребенка, а другая в это же время
убеждается в существовании родителя и создает к нему
ребенка - тут все просто, но хочется более похожего на постгресовский
пример, чтобы SELECT FOR UPDATE не помогал.

Спасибо.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33049790
Хм, а select for update (у нас называется updlock,holdlock) вроде бы и обеспечивает блокировку по предикатам. Только очень большие объёмы данных приходится блокировать в начале транзакции, если неизвестно какие запросы могут быть в конкурирующей транзакции.
И проблема в том примерчике тоже на блокировках объезжается.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33050574
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баззззлайтерХм, а select for update (у нас называется updlock,holdlock) вроде бы и обеспечивает блокировку по предикатам. Только очень большие объёмы данных приходится блокировать в начале транзакции, если неизвестно какие запросы могут быть в конкурирующей транзакции.
И проблема в том примерчике тоже на блокировках объезжается.

- не знаю, у кого именно select for update называется updlock
- согласен с полезностью предикатных блокировок; о том, какое отношение они имеют к реальной жизни, можно почитать на той же странице по соседству с примерчиком
- буду очень признателен за другие похожие примерчики - именно об этом я и просил в своем письме.

Спасибо.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33051458
ilejn
- не знаю, у кого именно select for update называется updlock

я на TSQL пишу

ну например table [Оборотка по счёту]([Дебит или Кредит],[Сумма])

процедура, которая вычисляет пени:
Begin Transaction
if SUM(Кредит)>SUM(Дебит)
Insert [Оборотка по счёту](Дебит,Сумма пени)
Commit

запускаем две транзакции, получаем два раза начисленные пени.
а если всю таблицу вначале заблокируем - то не получаем.
берёт за душу?
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33051522
обознатушки, перепрятушки.
то что я написал - это даже не serializable

Ну пускай первая транзакция считает обороты по кредиту и если больше некой суммы - пишет проводку по дебету.
А вторая - наоборот
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33054770
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баззззлайтерХм, а select for update (у нас называется updlock,holdlock) вроде бы и обеспечивает блокировку по предикатам.
Ээ.. по-моему, не совсем так. Правда, я дилетант в MSSQL, так что поправьте, если скажу глупость.

Прежде всего, в BOL написано, что updlock просто ставит на строки update-блокировку вместо shared. Таким образом, блокировки по предикатам (то есть блокировки insert-а записи, отвечающей условию, либо update-а записи в запись, отвечающую условию) он не делает.Что касается holdlock - это выполнение в режиме serializable. Давайте посмотрим, что дает их комбинация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table test_lock (i integer, j integer)

insert into test_lock values ( 1 ,  1 )
insert into test_lock values ( 1 ,  2 )
insert into test_lock values ( 1 ,  3 )
insert into test_lock values ( 2 ,  1 )
insert into test_lock values ( 2 ,  2 )
insert into test_lock values ( 2 ,  3 )

begin transaction
select * from test_lock with (updlock holdlock rowlock) where j =  1 

-- теперь идем в другую сессию и там...
begin transaction
select * from test_lock where j =  3 

... и на этом благополучно подвисаем. Из чего делаем вывод, что предикатную блокировку holdlock в каком-то смысле обеспечивает - но ооочень сильную. До проверки insert into test_lock values (3, 1) дело просто не доходит :)

Ну а что касается select for update - он блокирует строки, и предикатной блокировки опять-таки не обеспечивает.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33056437
прикольно, сиквел rowlock не понимает, если индекса ни одного нет
попробуйте
create unique clustered index idx_test_lock on test_lock(i,j)

Только "предикатную блокировку holdlock в каком-то смысле обеспечивает" - нельзя говорить. Это неправда. Я плохо сформулировал, а Вы ещё хуже. В сиквеле нет предикатных блокировок. Просто, есть практика блокировать страницы данных, которые-могли-бы-попадать-в-запросы конкурирующих транзакций.
Отличие в том, что Вы сами решаете, какие запросы могут быть - а не сервер.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33056851
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЭэ.. по-моему, не совсем так. Правда, я дилетант в MSSQL, так что поправьте, если скажу глупость.

Прежде всего, в BOL написано, что updlock просто ставит на строки update-блокировку вместо shared. Таким образом, блокировки по предикатам (то есть блокировки insert-а записи, отвечающей условию, либо update-а записи в запись, отвечающую условию) он не делает.Что касается holdlock - это выполнение в режиме serializable.


Я в MS SQL даже не дилетант, а наблюдатель-со-стороны, так что ограничусь вопросом.

Правильно ли я понимаю, что holdlock (он же serializable) без updlock обеспечивает-таки блокировку по предикатам (возможно, блокируя при этом что-то лишнее)?

Спасибо.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057019
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejn

баззззлайтер наверное, намекает на такую вещь как эскалацию блокировок, которая присутствует в большинстве блокировщиков (mssql, db2,...)
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057054
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баззззлайтерпопробуйте
create unique clustered index idx_test_lock on test_lock(i,j)
Я создавал таблицу с PK - вроде как при этом должен создаваться индекс на него?

баззззлайтерТолько "предикатную блокировку holdlock в каком-то смысле обеспечивает" - нельзя говорить. Это неправда.
Это был сарказм ;-)

ilejnПравильно ли я понимаю, что holdlock (он же serializable) без updlock обеспечивает-таки блокировку по предикатам (возможно, блокируя при этом что-то лишнее)?
Похоже, так. Точнее сказать, похоже на блокировку лишнего, куда попадают и предикатные записи :) Но вообще говоря, надо читать.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057427
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только "предикатную блокировку holdlock в каком-то смысле обеспечивает" - нельзя говорить. Это неправда. Я плохо сформулировал, а Вы ещё хуже. В сиквеле нет предикатных блокировок. Просто, есть практика блокировать страницы данных, которые-могли-бы-попадать-в-запросы конкурирующих транзакций.
Отличие в том, что Вы сами решаете, какие запросы могут быть - а не сервер.

Вы, судя по всему, друг друга еще понимаете, а вот я уже нет ;((

Давайте определим предикатную блокировку как гарантию того, что результаты любого запроса будут такими же, как и в первый раз. Обеспечивается ли это в MS SQL при Isolation Level Serializable?

Если приведенное выше определение предикатной блокировки не кажется удачным (или правильным), то какое нравится больше?

Отдельно буду признателен за рассказ про эскалацию блокировок в MS SQL.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057686
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejnДавайте определим предикатную блокировку как гарантию того, что результаты любого запроса будут такими же, как и в первый раз. Обеспечивается ли это в MS SQL при Isolation Level Serializable?
Ээ.. сформулированное - это repeatable read. Который есть более слабый уровень изоляции и соответственно обязан выполняться при serializable. Вопрос в том, что предикатная блокировка - далеко не единственный способ этого достичь, поэтому определять предикатную блокировку таким способом вряд ли верно.

ilejnОтдельно буду признателен за рассказ про эскалацию блокировок в MS SQL.
возможно, поможет
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057722
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ilejnДавайте определим предикатную блокировку как гарантию того, что результаты любого запроса будут такими же, как и в первый раз. Обеспечивается ли это в MS SQL при Isolation Level Serializable?
Ээ.. сформулированное - это repeatable read.


Мне кажется, что мое определение гарантирует отсутствие Phantom Read, т.е. соответствует определению Serializable из SQL'92.
Вы так не считаете?
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057797
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejnМне кажется, что мое определение гарантирует отсутствие Phantom Read, т.е. соответствует определению Serializable из SQL'92. Вы так не считаете?
Честно говоря, я сейчас не готов говорить строго формально, поэтому ограничусь мнением "на пальцах":

- Repeatable read требует, чтобы повторное чтение вернуло те же данные, что и первое.

- Serializable требует, чтобы запрос вернул данные на начало транзакции. Те данные, которые вернул бы запрос, будь он выполнен в момент start transaction.

Разница здесь дает возможности для коллизии. Допустим, транзакция 1 записывает данные в таблицу A и потом в таблицу B; транзакция 2 читает их. Тогда для repeatable read возможен вариант "транзакция 2 прочитала старые данные A, транзакция 1 сделала commit, транзакция 2 прочитала новые данные таблицы B". Для serializable такой вариант невозможен.

Для блокировочников здесь разницы практически нет - поскольку транзакция 2, пытаясь прочитать незакоммиченную A, повиснет на блокировке. Для версионника она оказывается существенной.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057803
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejnОтдельно буду признателен за рассказ про эскалацию блокировок в MS SQL.
возможно, поможет

Спасибо за ссылку.

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

Имея некоторые тайные знания о функционировании этого механизма(например, MS SQL guru может точно знать, что SELECT * from T where ID>100 приводит к блокировке всей таблицы и не дает вставить новую записьс ID 1000, что и требовалось для предикатной блокировки), действительно можно говорить о связи эскалации блокировок с предикатными блокировками. У меня эти тайные знания отсутствуют, так что хотелось бы комментариев.

Спасибо.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33057863
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- Repeatable read требует, чтобы повторное чтение вернуло те же данные, что и первое.


Возможно, все дело в нюансах использования русского языка.
Вы пишите "вернуло те же данные", а я "результаты запроса".

Repeatable Read гарантирует, что те строки, которые однажды вернул некоторый запрос, будут неизменны в дальнейшем. При этом, этот же "некоторый запрос" вполне может вернуть дополнительные строки.

Например, SELECT MAX(VALUE) FROM TBL при REPEATABLE READ имеет полное право быть разным, а вот при SERIALIZABLE он одинаков.

С другой стороны, если при Repeatable Read мы прочли запись с ID=345, то она должна остаться неизменной на протяжении транзакции.

- Serializable требует, чтобы запрос вернул данные на начало транзакции. Те данные, которые вернул бы запрос, будь он выполнен в момент start transaction.


Согласно стандарту, Serializable гарантирует отсутствие Phantom Read. Чуть раньше по тексту стандарта написано, что должно быть гарантировано такое конечное состояние данных, как если бы транзакции исполнялись последовательно.

Насколько я понимаю, транзакция с ISOLATION LEVEL SERIALIZABLE имеет полное моральное право прочитать данные, модифицированные после ее начала, и в блокировочниках это реально происходит.

Я заблуждаюсь?
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33058308
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejnЭскалация блокировок мне (и автору вышесосланной статьи) представляется механизмом для регулировки производительности сервера.
Мягкая формулировка :) Эскалация блокировок - это некий компромисс, выбор из двух зол. Она порождена предположением, что в какой-то ситуации потери на построчную проверку "не заблокированы ли данные" оказываются больше, нежели потери на "ковровую", глобальную блокировку и связанные с ней ложные срабатывания, дополнительные ожидания. Истинность этого предположения в том или ином случае тесно связана с архитектурой и реализацией сервера.

ilejnдействительно можно говорить о связи эскалации блокировок с предикатными блокировками.
Ээ.. связь достаточно простая - эксклюзивная блокировка таблицы блокирует записи, которые были бы заблокированы любой предикатной блокировкой :) Возможно, есть более тонкие механизмы - например, при предикате field = 20 заблокировать страницу индекса, на которой лежат все двадцатки. Это уже действительно нужно закапываться, я тут не помогу.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33058371
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilejnВозможно, все дело в нюансах использования русского языка.
Вы пишите "вернуло те же данные", а я "результаты запроса".
Скорее дело в стереотипах :) Я спутал стандартный repeatable read с более сильной изоляцией, которую оракл делает в read-only транзакциях.

ilejnНасколько я понимаю, транзакция с ISOLATION LEVEL SERIALIZABLE имеет полное моральное право прочитать данные, модифицированные после ее начала, и в блокировочниках это реально происходит.
Вы правы - а я неудачно сформулировал. "На начало транзакции" в данном случае означало "только данные, сохраненные более ранними в смысле последовательности сериализации транзакциями".
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33058413
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эскалация блокировок это такая фича сервера, который при определенных условиях выполняет повышение гранулярности блокировок. Например, если из N записей на странице для обеспечения isolation level требуется заблокировать 70% записей, т.е. наложить 0.7*N блокировок, то сервер может решить заменить эти блокировки одной, но для всей страницы. Таким образом, освободятся ресурсы, затраченные на 0.7*N блокировок, и возрастет скорость работы, так как с одной блокировкой работать проще и быстрее чем с 0.7*N.

Побочной стороной является блокировка "лишних" записей. Так что как сказал softwarer это компромисс.

Более подробно можно почитать здесь http://www.sql.ru/forum/actualtopics.aspx?search=%DD%F1%EA%E0%EB%E0%F6%E8%FF+%E1%EB%EE%EA%E8%F0%EE%E2%EE%EA&bid=1
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33058927
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я спутал стандартный repeatable read с более сильной изоляцией, которую оракл делает в read-only транзакциях.


Отлично. Мой любимый терновый куст и хороший повод вернуться к началу обсуждения.

SET TRANSACTION READONLY это то самое, из чего в Oracle вырос-таки некий уровень изоляции, названный Serializable. Различия между этим Serializable и Serializable в смысле стандарта отражены в
http://www.postgresql.org/docs/8.0/static/transaction-iso.html#MVCC-SERIALIZABILITY
Там все хорошо, кроме нежизненных примеров.
Я очень надеюсь, что коллективная фантазия, основанная на прочных знаниях, приобретенных в результате внимательного изучения сообщений в данной нити, способна породить что-нибудь интересное и понятное предпоследнему бухгалтеру ;)
А?

То, что привел здесь баззззлайтер, либо нерелевантно, либо я чего-то не понимаю, и хотел бы дополнительных объяснений.

Спасибо.
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33060718
Мне трудно привести пример, в котором serializable transaction не обеспечивает true serializibility в терминах того документа. SQL сервер блокирует все записи, которые ему приходилось просмотреть, чтобы получить результат - а не только те, которые в результат попали.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table tmpUsers(
id int identity( 1 , 1 ),
name varchar( 255 ),
summa int
)

insert into tmpUsers(name,summa) values ('masha', 1 )
insert into tmpUsers(name,summa) values ('sasha', 1 )

begin tran
 select summa from tmpUsers (updlock,holdlock,rowlock) where name = 'masha'

sp_lock @@spid
select @@Trancount

Вы увидите, что транзакция получила Exclusive lock на таблицу. Несмотря на rowlock. Понятно, что конкурентная транзакция будет заблокирована, и не сможет вкатать ещё одну строчку с name=masha, и этим нарушить serialazibility.
Это, кстати, эскалации блокировок никак не касается, без разницы - заблокирована таблица или все страницы в ней.

Давайте я с другой стороны подойду, раз уж взялся - В Какой Ситуации Блокировки По Предикатам Могли Бы Повысить Производительность?

Да в этой же. Почему бы серверу не блокировать всю таблицу, а проверять каждый следующий запрос, не касается ли он строчек с name=masha? Тогда бы второй коннект мог апдэйтить where name='sasha' одновременно с нашей транзакцией.

Вы возразите, мол нужно индекс по имени построить, а я отвечу - ну пусть не name=, а name like '%
...
Рейтинг: 0 / 0
Serializable Isolation versus True Serializability
    #33061548
ilejn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне трудно привести пример, в котором serializable transaction не обеспечивает true serializibility в терминах того документа. SQL сервер блокирует все записи, которые ему приходилось просмотреть, чтобы получить результат - а не только те, которые в результат попали.


Какой SQL сервер? MS SQL? Исходный вопрос касался версионников. И "тот документ" говорит о различиях между true serializability и поведением версионников. Пример демонстрирует достижение результата, которого просто не может быть при true serializability, он очень простой, но несколько оторванный от жизни.

Вы увидите, что транзакция получила Exclusive lock на таблицу. Несмотря на rowlock. Понятно, что конкурентная транзакция будет заблокирована, и не сможет вкатать ещё одну строчку с name=masha, и этим нарушить serialazibility.


В примере транзакция начинается только при подсчете суммы. Да, при выборе Serializable мы ее подсчитаем на некоторый строго определенный момент. Отлично. Все хорошо и здорово.

Основная проблема этого примера (или ограниченности моего мировосприятия) состоит в отсутствии описания решаемой задачи, после чего становится непонятно, как данные должны были бы выглядеть при true serializability, и что с чем мы сравниваем.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Serializable Isolation versus True Serializability
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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