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

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

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

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

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

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

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

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

я на TSQL пишу

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

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

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

Ну пускай первая транзакция считает обороты по кредиту и если больше некой суммы - пишет проводку по дебету.
А вторая - наоборот
...
Рейтинг: 0 / 0
08.05.2005, 20:12
    #33054770
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
баззззлайтерХм, а 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
11.05.2005, 05:07
    #33056437
Serializable Isolation versus True Serializability
прикольно, сиквел rowlock не понимает, если индекса ни одного нет
попробуйте
create unique clustered index idx_test_lock on test_lock(i,j)

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

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


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

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

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

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

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

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

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

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

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

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

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


Мне кажется, что мое определение гарантирует отсутствие Phantom Read, т.е. соответствует определению Serializable из SQL'92.
Вы так не считаете?
...
Рейтинг: 0 / 0
11.05.2005, 15:32
    #33057797
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
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
11.05.2005, 15:36
    #33057803
ilejn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
ilejnОтдельно буду признателен за рассказ про эскалацию блокировок в MS SQL.
возможно, поможет

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

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

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

Спасибо.
...
Рейтинг: 0 / 0
11.05.2005, 15:54
    #33057863
ilejn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
- 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
11.05.2005, 18:28
    #33058308
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
ilejnЭскалация блокировок мне (и автору вышесосланной статьи) представляется механизмом для регулировки производительности сервера.
Мягкая формулировка :) Эскалация блокировок - это некий компромисс, выбор из двух зол. Она порождена предположением, что в какой-то ситуации потери на построчную проверку "не заблокированы ли данные" оказываются больше, нежели потери на "ковровую", глобальную блокировку и связанные с ней ложные срабатывания, дополнительные ожидания. Истинность этого предположения в том или ином случае тесно связана с архитектурой и реализацией сервера.

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

ilejnНасколько я понимаю, транзакция с ISOLATION LEVEL SERIALIZABLE имеет полное моральное право прочитать данные, модифицированные после ее начала, и в блокировочниках это реально происходит.
Вы правы - а я неудачно сформулировал. "На начало транзакции" в данном случае означало "только данные, сохраненные более ранними в смысле последовательности сериализации транзакциями".
...
Рейтинг: 0 / 0
11.05.2005, 19:24
    #33058413
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
Эскалация блокировок это такая фича сервера, который при определенных условиях выполняет повышение гранулярности блокировок. Например, если из 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
12.05.2005, 09:13
    #33058927
ilejn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
Я спутал стандартный 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
12.05.2005, 18:29
    #33060718
Serializable Isolation versus True Serializability
Мне трудно привести пример, в котором 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
13.05.2005, 10:54
    #33061548
ilejn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Serializable Isolation versus True Serializability
Мне трудно привести пример, в котором serializable transaction не обеспечивает true serializibility в терминах того документа. SQL сервер блокирует все записи, которые ему приходилось просмотреть, чтобы получить результат - а не только те, которые в результат попали.


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

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


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

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


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