Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Коллеги, помогите, пожалуйста, придумать пример из какой-нибудь общепонятной предметной области, иллюстрирующий аномалию из http://www.postgresql.org/docs/8.0/static/transaction-iso.html#MVCC-SERIALIZABILITY Хочется вместо class и value что-нибудь более жизненное, берущее, я бы сказал, за душу. Есть похожий пример, где одна транзакция удаляет родителя, потому что у него нет ребенка, а другая в это же время убеждается в существовании родителя и создает к нему ребенка - тут все просто, но хочется более похожего на постгресовский пример, чтобы SELECT FOR UPDATE не помогал. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 14:40 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Хм, а select for update (у нас называется updlock,holdlock) вроде бы и обеспечивает блокировку по предикатам. Только очень большие объёмы данных приходится блокировать в начале транзакции, если неизвестно какие запросы могут быть в конкурирующей транзакции. И проблема в том примерчике тоже на блокировках объезжается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2005, 10:46 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
баззззлайтерХм, а select for update (у нас называется updlock,holdlock) вроде бы и обеспечивает блокировку по предикатам. Только очень большие объёмы данных приходится блокировать в начале транзакции, если неизвестно какие запросы могут быть в конкурирующей транзакции. И проблема в том примерчике тоже на блокировках объезжается. - не знаю, у кого именно select for update называется updlock - согласен с полезностью предикатных блокировок; о том, какое отношение они имеют к реальной жизни, можно почитать на той же странице по соседству с примерчиком - буду очень признателен за другие похожие примерчики - именно об этом я и просил в своем письме. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2005, 14:11 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
ilejn - не знаю, у кого именно select for update называется updlock я на TSQL пишу ну например table [Оборотка по счёту]([Дебит или Кредит],[Сумма]) процедура, которая вычисляет пени: Begin Transaction if SUM(Кредит)>SUM(Дебит) Insert [Оборотка по счёту](Дебит,Сумма пени) Commit запускаем две транзакции, получаем два раза начисленные пени. а если всю таблицу вначале заблокируем - то не получаем. берёт за душу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2005, 18:57 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
обознатушки, перепрятушки. то что я написал - это даже не serializable Ну пускай первая транзакция считает обороты по кредиту и если больше некой суммы - пишет проводку по дебету. А вторая - наоборот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2005, 19:36 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
баззззлайтерХм, а 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. ... и на этом благополучно подвисаем. Из чего делаем вывод, что предикатную блокировку holdlock в каком-то смысле обеспечивает - но ооочень сильную. До проверки insert into test_lock values (3, 1) дело просто не доходит :) Ну а что касается select for update - он блокирует строки, и предикатной блокировки опять-таки не обеспечивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 20:12 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
прикольно, сиквел rowlock не понимает, если индекса ни одного нет попробуйте create unique clustered index idx_test_lock on test_lock(i,j) Только "предикатную блокировку holdlock в каком-то смысле обеспечивает" - нельзя говорить. Это неправда. Я плохо сформулировал, а Вы ещё хуже. В сиквеле нет предикатных блокировок. Просто, есть практика блокировать страницы данных, которые-могли-бы-попадать-в-запросы конкурирующих транзакций. Отличие в том, что Вы сами решаете, какие запросы могут быть - а не сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 05:07 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
softwarerЭэ.. по-моему, не совсем так. Правда, я дилетант в MSSQL, так что поправьте, если скажу глупость. Прежде всего, в BOL написано, что updlock просто ставит на строки update-блокировку вместо shared. Таким образом, блокировки по предикатам (то есть блокировки insert-а записи, отвечающей условию, либо update-а записи в запись, отвечающую условию) он не делает.Что касается holdlock - это выполнение в режиме serializable. Я в MS SQL даже не дилетант, а наблюдатель-со-стороны, так что ограничусь вопросом. Правильно ли я понимаю, что holdlock (он же serializable) без updlock обеспечивает-таки блокировку по предикатам (возможно, блокируя при этом что-то лишнее)? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 11:10 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
ilejn баззззлайтер наверное, намекает на такую вещь как эскалацию блокировок, которая присутствует в большинстве блокировщиков (mssql, db2,...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 11:55 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
баззззлайтерпопробуйте create unique clustered index idx_test_lock on test_lock(i,j) Я создавал таблицу с PK - вроде как при этом должен создаваться индекс на него? баззззлайтерТолько "предикатную блокировку holdlock в каком-то смысле обеспечивает" - нельзя говорить. Это неправда. Это был сарказм ;-) ilejnПравильно ли я понимаю, что holdlock (он же serializable) без updlock обеспечивает-таки блокировку по предикатам (возможно, блокируя при этом что-то лишнее)? Похоже, так. Точнее сказать, похоже на блокировку лишнего, куда попадают и предикатные записи :) Но вообще говоря, надо читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 12:06 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Только "предикатную блокировку holdlock в каком-то смысле обеспечивает" - нельзя говорить. Это неправда. Я плохо сформулировал, а Вы ещё хуже. В сиквеле нет предикатных блокировок. Просто, есть практика блокировать страницы данных, которые-могли-бы-попадать-в-запросы конкурирующих транзакций. Отличие в том, что Вы сами решаете, какие запросы могут быть - а не сервер. Вы, судя по всему, друг друга еще понимаете, а вот я уже нет ;(( Давайте определим предикатную блокировку как гарантию того, что результаты любого запроса будут такими же, как и в первый раз. Обеспечивается ли это в MS SQL при Isolation Level Serializable? Если приведенное выше определение предикатной блокировки не кажется удачным (или правильным), то какое нравится больше? Отдельно буду признателен за рассказ про эскалацию блокировок в MS SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 13:51 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
ilejnДавайте определим предикатную блокировку как гарантию того, что результаты любого запроса будут такими же, как и в первый раз. Обеспечивается ли это в MS SQL при Isolation Level Serializable? Ээ.. сформулированное - это repeatable read. Который есть более слабый уровень изоляции и соответственно обязан выполняться при serializable. Вопрос в том, что предикатная блокировка - далеко не единственный способ этого достичь, поэтому определять предикатную блокировку таким способом вряд ли верно. ilejnОтдельно буду признателен за рассказ про эскалацию блокировок в MS SQL. возможно, поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 15:06 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
softwarer ilejnДавайте определим предикатную блокировку как гарантию того, что результаты любого запроса будут такими же, как и в первый раз. Обеспечивается ли это в MS SQL при Isolation Level Serializable? Ээ.. сформулированное - это repeatable read. Мне кажется, что мое определение гарантирует отсутствие Phantom Read, т.е. соответствует определению Serializable из SQL'92. Вы так не считаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 15:15 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
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, повиснет на блокировке. Для версионника она оказывается существенной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 15:32 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
ilejnОтдельно буду признателен за рассказ про эскалацию блокировок в MS SQL. возможно, поможет Спасибо за ссылку. Эскалация блокировок мне (и автору вышесосланной статьи) представляется механизмом для регулировки производительности сервера. Имея некоторые тайные знания о функционировании этого механизма(например, MS SQL guru может точно знать, что SELECT * from T where ID>100 приводит к блокировке всей таблицы и не дает вставить новую записьс ID 1000, что и требовалось для предикатной блокировки), действительно можно говорить о связи эскалации блокировок с предикатными блокировками. У меня эти тайные знания отсутствуют, так что хотелось бы комментариев. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 15:36 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
- 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 имеет полное моральное право прочитать данные, модифицированные после ее начала, и в блокировочниках это реально происходит. Я заблуждаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 15:54 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
ilejnЭскалация блокировок мне (и автору вышесосланной статьи) представляется механизмом для регулировки производительности сервера. Мягкая формулировка :) Эскалация блокировок - это некий компромисс, выбор из двух зол. Она порождена предположением, что в какой-то ситуации потери на построчную проверку "не заблокированы ли данные" оказываются больше, нежели потери на "ковровую", глобальную блокировку и связанные с ней ложные срабатывания, дополнительные ожидания. Истинность этого предположения в том или ином случае тесно связана с архитектурой и реализацией сервера. ilejnдействительно можно говорить о связи эскалации блокировок с предикатными блокировками. Ээ.. связь достаточно простая - эксклюзивная блокировка таблицы блокирует записи, которые были бы заблокированы любой предикатной блокировкой :) Возможно, есть более тонкие механизмы - например, при предикате field = 20 заблокировать страницу индекса, на которой лежат все двадцатки. Это уже действительно нужно закапываться, я тут не помогу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 18:28 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
ilejnВозможно, все дело в нюансах использования русского языка. Вы пишите "вернуло те же данные", а я "результаты запроса". Скорее дело в стереотипах :) Я спутал стандартный repeatable read с более сильной изоляцией, которую оракл делает в read-only транзакциях. ilejnНасколько я понимаю, транзакция с ISOLATION LEVEL SERIALIZABLE имеет полное моральное право прочитать данные, модифицированные после ее начала, и в блокировочниках это реально происходит. Вы правы - а я неудачно сформулировал. "На начало транзакции" в данном случае означало "только данные, сохраненные более ранними в смысле последовательности сериализации транзакциями". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 19:00 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Эскалация блокировок это такая фича сервера, который при определенных условиях выполняет повышение гранулярности блокировок. Например, если из 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 19:24 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Я спутал стандартный repeatable read с более сильной изоляцией, которую оракл делает в read-only транзакциях. Отлично. Мой любимый терновый куст и хороший повод вернуться к началу обсуждения. SET TRANSACTION READONLY это то самое, из чего в Oracle вырос-таки некий уровень изоляции, названный Serializable. Различия между этим Serializable и Serializable в смысле стандарта отражены в http://www.postgresql.org/docs/8.0/static/transaction-iso.html#MVCC-SERIALIZABILITY Там все хорошо, кроме нежизненных примеров. Я очень надеюсь, что коллективная фантазия, основанная на прочных знаниях, приобретенных в результате внимательного изучения сообщений в данной нити, способна породить что-нибудь интересное и понятное предпоследнему бухгалтеру ;) А? То, что привел здесь баззззлайтер, либо нерелевантно, либо я чего-то не понимаю, и хотел бы дополнительных объяснений. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 09:13 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Мне трудно привести пример, в котором serializable transaction не обеспечивает true serializibility в терминах того документа. SQL сервер блокирует все записи, которые ему приходилось просмотреть, чтобы получить результат - а не только те, которые в результат попали. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Вы увидите, что транзакция получила Exclusive lock на таблицу. Несмотря на rowlock. Понятно, что конкурентная транзакция будет заблокирована, и не сможет вкатать ещё одну строчку с name=masha, и этим нарушить serialazibility. Это, кстати, эскалации блокировок никак не касается, без разницы - заблокирована таблица или все страницы в ней. Давайте я с другой стороны подойду, раз уж взялся - В Какой Ситуации Блокировки По Предикатам Могли Бы Повысить Производительность? Да в этой же. Почему бы серверу не блокировать всю таблицу, а проверять каждый следующий запрос, не касается ли он строчек с name=masha? Тогда бы второй коннект мог апдэйтить where name='sasha' одновременно с нашей транзакцией. Вы возразите, мол нужно индекс по имени построить, а я отвечу - ну пусть не name=, а name like '% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 18:29 |
|
||
|
Serializable Isolation versus True Serializability
|
|||
|---|---|---|---|
|
#18+
Мне трудно привести пример, в котором serializable transaction не обеспечивает true serializibility в терминах того документа. SQL сервер блокирует все записи, которые ему приходилось просмотреть, чтобы получить результат - а не только те, которые в результат попали. Какой SQL сервер? MS SQL? Исходный вопрос касался версионников. И "тот документ" говорит о различиях между true serializability и поведением версионников. Пример демонстрирует достижение результата, которого просто не может быть при true serializability, он очень простой, но несколько оторванный от жизни. Вы увидите, что транзакция получила Exclusive lock на таблицу. Несмотря на rowlock. Понятно, что конкурентная транзакция будет заблокирована, и не сможет вкатать ещё одну строчку с name=masha, и этим нарушить serialazibility. В примере транзакция начинается только при подсчете суммы. Да, при выборе Serializable мы ее подсчитаем на некоторый строго определенный момент. Отлично. Все хорошо и здорово. Основная проблема этого примера (или ограниченности моего мировосприятия) состоит в отсутствии описания решаемой задачи, после чего становится непонятно, как данные должны были бы выглядеть при true serializability, и что с чем мы сравниваем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2005, 10:54 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33051458&tid=1545887]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 494ms |

| 0 / 0 |
