|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Старые песни о главном. Промурыжил много тем и тут и в гугле, но общая картина складывается какая то странная. Чтобы не обсуждать абстрактно, приведу пример (вырожденный, потом обобщу) Есть таблица остатков (скажем денсредств) и 2 потока каждый из которых читает: SELECT sum FROM account WHERE key = 5, допустим сумма равна 3-м, на сервере приложений добавляет к 3, свою сумму, скажем первый добавляет 2, второй добавляет 3, и пытается записать результат UPDATE account SET sum = result WHERE key=5. (правильный ответ, если что : 3+2+3 = 8). Предположим они идут параллельно, первый считал - второй считал - первый записал - второй записал. Итак что будут делать (по умолчанию (!)) с repeatable read каждая из СУБД: 1. MS SQL на сколько я понимаю на первое чтение будет 3 и повесит S блокировку, на второе чтение будет 3 и повесит S блокировку - на первой записи значения 5 попытается конвертить S блокировку в X и повиснет, так как на втором чтении висит S блокировка, на второй записи значения 6 попытается конвертить S в X, также повиснет, после чего один из процессов пометится как deadlock (допустим 2-й), кинет exception, и попросит сервер приложений повторить 2-ю транзакцию, в итоге сначала запишется 5, при повторе запишется 8 все ОК. 2. PostgreSQL и Firebird - первое чтение будет 3, второе чтение будет 3, первая запись будет 5 и пройдет, вторая запись увидит что значение изменилось с начала транзакции и кинет exception, и "попросит" сервер приложений повторить, тот заново начнет транзакцию и запишет 8 - все ОК. 3. Самое веселое в Oracle, который как я понимаю сначала запишет 5, а потом запишет 6 и будет думать что все ОК. Хотя это не так. Теперь замечания: a) я так понимаю для 2 и 3 можно повторять поведение 1 при помощи SELECT FOR UPDATE, правда там будет U блокировка, то есть уже второе чтение повиснет и предотвратит deadlock, ну или SELECT FOR SHARE - тогда поведение будет точь в точь как в пункте 1. б) у 1 я так понимаю без "ручной" работы с timestamp'ом повторить 2-е поведение автоматически нет возможности. Хотя как я понимаю нет особой разницы какой exception будет deadlock или update conflict (я так понимаю второй все же чаще бывает, но ресурсы на блокировки зато не тратятся) в) у 3 я так понимаю можно включить TIL SERIALIZABLE и он тогда будет вести себе как 1 или как SELECT FOR UPDATE в пункте а) Понимаю что где-то заблуждаюсь (а может и везде), поэтому и спрашиваю в каком пункте я не прав. ЗЫ: Да, я в курсе что UPDATE account SET sum = sum + 2 WHERE key = 5, UPDATE account SET sum = sum + 3 WHERE key = 5, даже при READ COMMITED дадут 8 (кстати во втором случае да или нет?), но тут вопрос что вычисление может быть сложнее, требовать что-то еще чем просто суммирование, поэтому этот пример привел чтобы не усложнять. И еще такой вопрос: Если есть SELECT x FROM t1 LEFT JOIN (SELECT SUM(f),j FROM t2 GROUP BY j) Q ON Q.j = t1.x, в блокировочниках (и SELECT FOR UPDATE), S-блокироки повесятся на всю таблицу t2, или только на те у которых j из таблицы t1. Потому как это получается зависит от построенного плана выполнения, если решит сделать predicate push down - блокировки будут только на нужные данные, если нет то на всю таблицу? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 12:41 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
студент учи что такое транзакции, ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 15:47 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
ScareCrowстудент учи что такое транзакции, Очень ценное замечание. Чтобы я без него делал даже не знаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 15:57 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Логика железная, кстати. Вспоминаю "Ералаш", там где 13*7=28. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 16:00 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Кстати если кто не понял расширю процесс: первый начал транзакцию - второй начал транзакцию - первый считал - второй считал - первый записал - второй записал - первый коммитнул транзакцию - второй коммитнул транзакцию ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 16:01 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Мимо пробегал...Логика железная, кстати. Вспоминаю "Ералаш", там где 13*7=28. Еще одно ценное замечание. Очень полезный форум. Надо почаще писать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 16:03 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
авторб) у 1 я так понимаю без "ручной" работы с timestamp'ом повторить 2-е поведение автоматически нет возможности. Хотя как я понимаю нет особой разницы какой exception будет deadlock или update conflict (я так понимаю второй все же чаще бывает, но ресурсы на блокировки зато не тратятся) Неправильно понимаете. У 1 версионный режим существует аж с 2005 года. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 17:26 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
pkarklinавторб) у 1 я так понимаю без "ручной" работы с timestamp'ом повторить 2-е поведение автоматически нет возможности. Хотя как я понимаю нет особой разницы какой exception будет deadlock или update conflict (я так понимаю второй все же чаще бывает, но ресурсы на блокировки зато не тратятся) Неправильно понимаете. У 1 версионный режим существует аж с 2005 года. Это да, я уже тоже заметил... А он как 3 или как 2 работает? В смысле кидает update conflict exception или просто перезаписывает (ну или там минимум \ максимум и т.п. как в oracle strams)... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 17:42 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Transactions running under snapshot isolation take an optimistic approach to data modification by acquiring locks on data before performing the modification only to enforce constraints. Otherwise, locks are not acquired on data until the data is to be modified. When a data row meets the update criteria, the snapshot transaction verifies that the data row has not been modified by a concurrent transaction that committed after the snapshot transaction began. If the data row has been modified outside of the snapshot transaction, an update conflict occurs and the snapshot transaction is terminated. The update conflict is handled by the Database Engine and there is no way to disable the update conflict detection. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 17:55 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
pkarklinNitro_Junkie, Transactions running under snapshot isolation take an optimistic approach to data modification by acquiring locks on data before performing the modification only to enforce constraints. Otherwise, locks are not acquired on data until the data is to be modified. When a data row meets the update criteria, the snapshot transaction verifies that the data row has not been modified by a concurrent transaction that committed after the snapshot transaction began. If the data row has been modified outside of the snapshot transaction, an update conflict occurs and the snapshot transaction is terminated . The update conflict is handled by the Database Engine and there is no way to disable the update conflict detection. То есть я так понимаю работает как 2? Тогда зачет мелкософту :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:04 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Правда как 3 он работать не умеет, судя по фразе автор there is no way to disable the update conflict detection Другое дело зачем oracle так резолвит update conflict'ы мне не до конца понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:05 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
а как вы предлагаете их резолвить при оптимистичной блокировке? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:17 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
ScareCrowа как вы предлагаете их резолвить при оптимистичной блокировке? ну постгря же подругому резолвит, причем тоже оптимистически ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:22 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
ScareCrowа как вы предлагаете их резолвить при оптимистичной блокировке? Кидать exception. Ну иметь этот вариант точно, потому как просто всегда записывать последнее это жесть... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:23 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
ScareCrowа как вы предлагаете их резолвить при оптимистичной блокировке? в Firebird/InterBase, в версионнике, snapshot может попытаться поменять измененные с момента его стартат данные, только если они были отменены по rollback. То есть, Tran1 - snapshot start Tran2 - update X Tran1 - update X - получаем lock conflict Если Tran2 сделает Rollback, то Tran1 может повторить update Если Tran2 сделает Commit, то Tran1 эту запись не обновит в принципе, потому что она "не видит" изменения , сделанного Tran2, в силу своего уровня изолированности. А раз не может видеть (видит только то, что было до действий Tran2), значит не может и изменить. И перешибать значение 3 на что-то свое, зная, что там уже это значение изменено и закоммичено - как бы моветон. Snapshot это как бы snapshot и есть. Другое дело, что стандартный RepeatableRead позволяет видеть фантомы... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:27 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
автортолько если они были отменены по rollback. эм? если что то Rollback - то этого как бы и нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:29 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
и насколько я помню Firebird там это возможно только если указать wait у транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:29 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Ivan DurakScareCrowа как вы предлагаете их резолвить при оптимистичной блокировке? ну постгря же подругому резолвит, причем тоже оптимистически эм? http://www.postgresql.org/docs/9.3/static/transaction-iso.html авторIf the first updater rolls back, then its effects are negated and the repeatable read transaction can proceed with updating the originally found row. But if the first updater commits (and actually updated or deleted the row, not just locked it) then the repeatable read transaction will be rolled back with the message ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:32 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
kdvScareCrowа как вы предлагаете их резолвить при оптимистичной блокировке? в Firebird/InterBase, в версионнике, snapshot может попытаться поменять измененные с момента его стартат данные, только если они были отменены по rollback. То есть, Tran1 - snapshot start Tran2 - update X Tran1 - update X - получаем lock conflict Если Tran2 сделает Rollback, то Tran1 может повторить update Если Tran2 сделает Commit, то Tran1 эту запись не обновит в принципе, потому что она "не видит" изменения , сделанного Tran2, в силу своего уровня изолированности. А раз не может видеть (видит только то, что было до действий Tran2), значит не может и изменить. И перешибать значение 3 на что-то свое, зная, что там уже это значение изменено и закоммичено - как бы моветон. Snapshot это как бы snapshot и есть. Другое дело, что стандартный RepeatableRead позволяет видеть фантомы... Кстати да в, описанном мной примере, update conflict кидается не сразу, а по завершении 1-й транзакции, в надежде что эта транзакция rollback'ся хотя это как-то ИМХО чересчур оптимистично (в среднем процент rollback'ых транзакций не сильно большой), можно было бы и сразу кинуть. Я просто опустил этот момент, чтобы не усложнять ситуацию, и считал что транзакция начинается при первом чтении и коммитится сразу после записи. А что касается фантомов, то, по идее, можно придумать (правда мегаизвращенный случай) когда его и в serializable'е можно получить. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:34 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
ScareCrowIvan Durakпропущено... ну постгря же подругому резолвит, причем тоже оптимистически эм? http://www.postgresql.org/docs/9.3/static/transaction-iso.html авторIf the first updater rolls back, then its effects are negated and the repeatable read transaction can proceed with updating the originally found row. But if the first updater commits (and actually updated or deleted the row, not just locked it) then the repeatable read transaction will be rolled back with the message Чего же вы дальше не процитировали?: But if the first updater commits (and actually updated or deleted the row, not just locked it) then the repeatable read transaction will be rolled back with the message ERROR: could not serialize access due to concurrent update because a repeatable read transaction cannot modify or lock rows changed by other transactions after the repeatable read transaction began. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:36 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
ScareCrowнасколько я помню Firebird там это возможно только если указать wait у транзакции. Точнее если не указать no wait, поскольку wait это режим по умолчанию. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:37 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Так все таки, а в Оракле что обычно делают? SERIALIZABLE включают? Ручные блокировки FOR UPDATE используют? Смотрят на системную колонку версии ряда ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:46 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieТак все таки, а в Оракле что обычно делают? Говорят "фу, что это у вас за update conflict-ы, у нас вот такого дерьма нет". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:51 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovNitro_JunkieТак все таки, а в Оракле что обычно делают? Говорят "фу, что это у вас за update conflict-ы, у нас вот такого дерьма нет". :) . А если серьезно? Им что жалко было такой режим сделать, для версионника это же не проблема? С учетом : Oracle has chosen the harder-to-implement but infinitely more concurrent multi-versioning scheme. ЗЫ: Правда при этом описание repeatable read прерывается, а до этого были только лучи ненависти к deadlock'а. И нигде описание что oracle будет делать в том случае, когда блокировочник кинет deadlock. Пойти что ли на oracle'овски подфорум, или меня там ногами запинают? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 18:58 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieА если серьезно? Отрывают руки тем, кто пишет "а=5" вместо "а=а+2". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 19:00 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovNitro_JunkieА если серьезно? Отрывают руки тем, кто пишет "а=5" вместо "а=а+2". А если мне нужно какую то более сложную обработку, которая в один запрос не укладывается сделать? Или по их мнению таких не бывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 19:14 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, В процедуру оберни - она тоже внутри транзакции крутится. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 19:26 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
DarkMasterNitro_Junkie, В процедуру оберни - она тоже внутри транзакции крутится. Причем тут процедура? если у меня одним запросом читается, а вторым пишется (с учетом считанных данных), как в примере, чем это мне поможет? У меня и так все "в транзакции". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 19:28 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieИли по их мнению таких не бывает? Именно так. Потому вопрос "как сделать ХХХХ одним запросом" так часто задаётся. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 19:49 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovNitro_JunkieИли по их мнению таких не бывает? Именно так. Потому вопрос "как сделать ХХХХ одним запросом" так часто задаётся. Ясно. "Мы успешно решаем проблемы, которые сами себе создаем". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 19:54 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Итак что будут делать (по умолчанию (!)) с repeatable read каждая из СУБД: Описанная тобой транзакция должна работать на уровне 0, меньше read uncommitted, поэтому что это модификация данных, и если данные при чтении не блокировать, то будет worm hole на любом уровне изоляции. То, что ты описал, есть как раз тривиальный случай несериализуемой транзакции, как раз и описывающей минимальный уровень изоляции 0, который все субд должны поддерживать. Рекомендую кстати почитать про теме статью незабвенного Грея и его коллег, под названием «критика уровней изоляции транзакций ANSI». Статья есть в интернете и на русском тоже, на citforum точно валяется. Статья хороша тем, что коротка, но сразу вправляет человеку мозги в этом о отношении раз и навсегда. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 23:23 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieScareCrowстудент учи что такое транзакции, Очень ценное замечание. Чтобы я без него делал даже не знаю... Nitro_Junkie, тут трепа будет на 10 страниц вокруг этого, и все будут не правы, и ты кстати уже тоже уцепился на это. В ANSI SQL нет уровней изоляции, которые позволяли бы решить указанную тобой проблему. В ANSI SQL есть уровни изоляции только для разрешения проблем чтения данных, а твой пример — пример 2х транзакций записи. А ты уже пустился в рассуждения о том, Как же будут себя вести разные субд на этих уровнях. Да никак, те уровни — о другом. А про select for update — да, он обязан там быть, и это правильное и единственное решение, причем оно на всех субд одинаково . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 23:33 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Как бы надуманная проблема для Оракла. Можно написат. UPDATE account SET sum = 5 WHERE key = 5 AND sum = 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 01:35 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZivNitro_Junkie, Итак что будут делать (по умолчанию (!)) с repeatable read каждая из СУБД: Описанная тобой транзакция должна работать на уровне 0, меньше read uncommitted, поэтому что это модификация данных, и если данные при чтении не блокировать, то будет worm hole на любом уровне изоляции. То, что ты описал, есть как раз тривиальный случай несериализуемой транзакции, как раз и описывающей минимальный уровень изоляции 0, который все субд должны поддерживать. Рекомендую кстати почитать про теме статью незабвенного Грея и его коллег, под названием «критика уровней изоляции транзакций ANSI». Статья есть в интернете и на русском тоже, на citforum точно валяется. Статья хороша тем, что коротка, но сразу вправляет человеку мозги в этом о отношении раз и навсегда. Статья неплохая, но непонятно что она меняет. Да я понимаю, что в СУБД, идет компромисс между : 1. Производительностью (параллельностью) 2. Целостностью (последовательностью) Они предлагают расширить уровни изоляции и виды ошибок, ок не вопрос. Но по их предлагаемой классификации в таблице 4 у Oracle'а когда ставится REPEATABLE READ на самом деле работает условно SNAPSHOT ISOLATION, остальные же СУБД реально работают в REPEATABLE READ. Вопрос какого хрена они не сделали это хотя бы опционально? Это же не сложно. А то что скажем термин REPEATABLE READ не удачный, что СУБД его трактуют по разному (точнее одно СУБД называемое Oracle), и что можно ввести еще несколько уровней и точнее определить блокировки это понятно. Просто непонятно нахрена такая детализация нужна? Сейчас READ UNCOMMITED - NoSQL, READ COMMITED - целостность в рамках транзакции на совести разработчика (крутись как хочешь), REPEATABLE READ - целостность в 95%, SERIALIZABLE - целостность в 99.99 (а может 100), только очень четко должно быть все спроектировано, чтобы по производительности вытянуло. Уровень SNAPSHOT ISOLATION - видимо нужен специально для Oracle. А CURSOR STABILITY только для курсоров которые далеко не все используют (и вообще немного из другой оперы так как вводит доп абстракцию курсоры, я так могу ввести еще абстракцию сервер приложений и еще с десяток уровней изоляции придумать). Про уровень 0 не понял. Это же даже по их классификации грязнее чтения чем просто Dirty Read, причем тут он? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 12:20 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
mikronNitro_Junkie, Как бы надуманная проблема для Оракла. Можно написат. UPDATE account SET sum = 5 WHERE key = 5 AND sum = 3 Что, серьезно поможет? В каком уровне изоляции REPEATABLE READ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 12:22 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Про уровень 0 не понял. Это же даже по их классификации грязнее чтения чем просто Dirty Read, причем тут он? А, значит главное ты так и не понял. 0 - это согласованная запись, минимальный уровень изоляции, который только возможен, если хочешь соблюдать транзакционность. Я также не понял, что ты в итоге хочешь, понять уровни изоляции, или разобраться , как решать проблему в том конкретном случае, который ты привел. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 12:45 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieНо по их предлагаемой классификации в таблице 4 у Oracle'а когда ставится REPEATABLE READ на самом деле работает условно SNAPSHOT ISOLATION, остальные же СУБД реально работают в REPEATABLE READ. Вопрос какого хрена они не сделали это хотя бы опционально? Это же не сложно. А то что скажем термин REPEATABLE READ не удачный, что СУБД его трактуют по разному (точнее одно СУБД называемое Oracle), К сожалению, в мире полно идиотов, и для того, чтобы ими управлять, принимаются "политические" решения. Одним из таких политических вопросов являются стандарты ANSI и следование им. Вопрос "СУБД такая-то поддерживает стандарт ANSI SQL такой-то" является политическим; не меняя ничего важного, он многое меняет в решениях, которые принимают идиоты. Поэтому в СУБД делаются различные дурацкие движения для якобы поддержки стандарта, и когда принимаются стандарты, бушуют войны на тему "как бы сформулировать стандарт так, чтобы мы его поддерживали, а конкуренты - нет". В результате появляются мертворождённые уродцы, согласно которым куча существующих СУБД одинаково хреново, но поддерживает этот бессмысленный "стандарт". ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 12:47 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
softwarerNitro_JunkieНо по их предлагаемой классификации в таблице 4 у Oracle'а когда ставится REPEATABLE READ на самом деле работает условно SNAPSHOT ISOLATION, остальные же СУБД реально работают в REPEATABLE READ. Вопрос какого хрена они не сделали это хотя бы опционально? Это же не сложно. А то что скажем термин REPEATABLE READ не удачный, что СУБД его трактуют по разному (точнее одно СУБД называемое Oracle), К сожалению, в мире полно идиотов, и для того, чтобы ими управлять, принимаются "политические" решения. Одним из таких политических вопросов являются стандарты ANSI и следование им. Вопрос "СУБД такая-то поддерживает стандарт ANSI SQL такой-то" является политическим; не меняя ничего важного, он многое меняет в решениях, которые принимают идиоты. Поэтому в СУБД делаются различные дурацкие движения для якобы поддержки стандарта, и когда принимаются стандарты, бушуют войны на тему "как бы сформулировать стандарт так, чтобы мы его поддерживали, а конкуренты - нет". В результате появляются мертворождённые уродцы, согласно которым куча существующих СУБД одинаково хреново, но поддерживает этот бессмысленный "стандарт". Я это понимаю, и в чем то согласен. Но млин Oracle там настроек делает вагон и маленькую тележку, что им мешает просто при update'е сверить версию записи с версией начала транзакции и если она больше кинуть exception. Я же не автоматический блокировочник от них хочу, а одну маленькую штуку которая с очень большой вероятностью обеспечит мне поддержку одного из самых популярных конфликтов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 12:58 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieЧто, серьезно поможет? В каком уровне изоляции REPEATABLE READ? для READ COMMITTED а для SERIALIZABLE уже не нужно. А других уровней у оракла (10.2) я не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 12:58 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZivNitro_Junkie, Про уровень 0 не понял. Это же даже по их классификации грязнее чтения чем просто Dirty Read, причем тут он? А, значит главное ты так и не понял. 0 - это согласованная запись, минимальный уровень изоляции, который только возможен, если хочешь соблюдать транзакционность. Я также не понял, что ты в итоге хочешь, понять уровни изоляции, или разобраться , как решать проблему в том конкретном случае, который ты привел. И как мне минимальный уровень изоляции поможет решить проблему, которую я привел? SELECT FOR UPDATE расставлять? Так это я с любым уровнем изоляции могу делать (даже READ COMMITED). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:00 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
mikronNitro_JunkieЧто, серьезно поможет? В каком уровне изоляции REPEATABLE READ? для READ COMMITTED а для SERIALIZABLE уже не нужно. А других уровней у оракла (10.2) я не знаю. Так в приведенном случае с READ COMMITED она сначала запишет 5, а во втором ничего не запишет, и останется 5, что тоже неправильно. Или предполагается ловить rows updated и если там 0 то самому "кидать" exception. Так это ручной режим, я его могу и timestamp'ами (как и у блокировочников) решить, просто можно заколебаться это делать в каждом случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:04 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie И как мне минимальный уровень изоляции поможет решить проблему, которую я привел? SELECT FOR UPDATE расставлять? Так это я с любым уровнем изоляции могу делать (даже READ COMMITED). Опять ты ничего не понял. SELECT FOR UPDATE и есть этот минимальный уровень изоляции. И никакие другие уровни уже тут ни при чём. И кроме расстановки FOR UPDATE в SELECT-ы никакие другие уровни изоляции не помогут, и не нужны. Эта проблема, описанная тобой, никакими другими уровнями изоляции не решается. Понял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:26 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Раньше был такой продукт MS FoxPro, там было два класса методов блокировок: пессимистическая блокировка оптимистическая блокировка Да, в данном случае, оптимистическую блокировку нужно реализовывать на клиенте. НО большинство средств разработки так и поступают (например Oracle Forms, ряд ООП оберток над БД). Т.ч. обычно проблем с этим нет. То, что сервер выдал exception, в любом случае никак не спасет - этот exception еще как-то *вменяемо* обработать нужно. IMHO & AFAIK Nitro_Junkie...Я же не автоматический блокировочник от них хочу, а одну маленькую штуку которая с очень большой вероятностью обеспечит мне поддержку одного из самых популярных конфликтов... Позвоните Ларри, предложите ему денег. Он попросит программистов реализовать ))). Все зависит от Вас (точнее Ваших финансовых возможностей) ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:28 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZiv, ", и не нужны." -- для этого случая, я имел в виду, естественно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:30 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZivЭта проблема, описанная тобой, никакими другими уровнями изоляции не решается. Разве она не решается в 95% (а то и 100) установкой REPEATABLE READ в MSSQL (в обоих режимах), Postgres, Firebird и т.п. и перепроведением транзакции при deadlock \ update conflict'е ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:32 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevНО большинство средств разработки так и поступают (например Oracle Forms, ряд ООП оберток над БД). Т.ч. обычно проблем с этим нет. Там только в ORM проблем нет, как только начинаешь чистый SQL юзать, те же яйца. Только не надо говорит не юзайте SQL, я даже это обсуждать не буду :) Leonid KudryavtsevТо, что сервер выдал exception, в любом случае никак не спасет - этот exception еще как-то *вменяемо* обработать нужно. Очень даже спасет во многих случаях, я просто перезапущу транзакцию (причем могу это даже сделать невидимо для пользователя). Позвоните Ларри, предложите ему денег. Он попросит программистов реализовать ))). Все зависит от Вас (точнее Ваших финансовых возможностей) ))) Спасибо, но я лучше тогда вместо оракла, mssql юзать (предлагать) буду, переплачивать хрен знает сколько и получать такую проблему на ровном месте. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:36 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieЯ это понимаю, и в чем то согласен. Но млин Oracle там настроек делает вагон и маленькую тележку, что им мешает просто при update'е сверить версию записи с версией начала транзакции и если она больше кинуть exception. Я же не автоматический блокировочник от них хочу, а одну маленькую штуку которая с очень большой вероятностью обеспечит мне поддержку одного из самых популярных конфликтов. Э.. ммм... А если вы всё же РАЗНЫЕ поля данной записи будете менять ? Версии будут разные, получишь ты exception, транзакцию откатишь, и всё зря ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:46 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZivNitro_JunkieЯ это понимаю, и в чем то согласен. Но млин Oracle там настроек делает вагон и маленькую тележку, что им мешает просто при update'е сверить версию записи с версией начала транзакции и если она больше кинуть exception. Я же не автоматический блокировочник от них хочу, а одну маленькую штуку которая с очень большой вероятностью обеспечит мне поддержку одного из самых популярных конфликтов. Э.. ммм... А если вы всё же РАЗНЫЕ поля данной записи будете менять ? Версии будут разные, получишь ты exception, транзакцию откатишь, и всё зря ? Ну конечно круче было бы если по колонкам проверял, но и по записям сойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:50 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieЯ это понимаю, и в чем то согласен. Но млин Oracle там настроек делает вагон и маленькую тележку, что им мешает просто при update'е сверить версию записи с версией начала транзакции 1. Во-первых, регулировать подобное поведение настройками - худшее возможное решение. С этим в MSSQL, пожалуйста, хотя и там от этого стараются уйти 2. Ничто, они, собственно, так и делают. Попробуйте воспроизвести свой пример в Oracle на уровне изоляции выше read committed, и Вас ожидает сюрприз :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:57 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, я немного потерял нить дискусси. Вы спросить хотите или доказать что оракл - недо(-делка, -стандарт, ...)? У оракла нету того что вы там ищите. Есть или меншее или большее. Обоснуйте, зачем вам нужно это промежуточное. Почему вам serailzable не подходит? Мне концепция оракл именно здесь кажется очень последовательной и продуманной. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:57 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
mikronПочему вам serailzable не подходит? Мне концепция оракл именно здесь кажется очень последовательной и продуманной. Она последовательна и продуманна, она просто не везде хорошо ложится на другую концепцию, придуманную для блокировочников. По-хорошему, следовало бы не пудрить людям мозги, но политика требует называть одинаковыми словами и говорить "мы поддерживаем". ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 13:59 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieРазве она не решается в 95% (а то и 100) установкой REPEATABLE READ в MSSQL (в обоих режимах), Postgres, Firebird и т.п. и перепроведением транзакции при deadlock \ update conflict'е ? Это не решение. Когда у Вас подтекает бачок в туалете (приложение создаёт ошибочные ситуации), проблема решается фиксингом бачка (исправлением багов в приложении), а не установкой в туалет ведра со шваброй (перезапуском транзакции). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 14:02 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Вы говорите про "стандартное" поведение REPEATABLE READ. У Оракла стандартно READ COMMITED. Он ведёт себя так как вы описали. следуюший уровень SERIALIZABLE - так как вы хотите. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 14:05 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
softwarer2. Ничто, они, собственно, так и делают. Попробуйте воспроизвести свой пример в Oracle на уровне изоляции выше read committed, и Вас ожидает сюрприз :) Так ожидает или нет? А то тут 2 ветви дискуссии и в одной точно все уверены что нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 14:51 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
mikronNitro_Junkie, я немного потерял нить дискусси. Вы спросить хотите или доказать что оракл - недо(-делка, -стандарт, ...)? У оракла нету того что вы там ищите. Есть или меншее или большее. Обоснуйте, зачем вам нужно это промежуточное. Почему вам serailzable не подходит? Мне концепция оракл именно здесь кажется очень последовательной и продуманной. Ну хотелось бы repeatable read но без поиска фантомов (так как это не всегда нужный overkill). Хотя возможно вы и правы, или все (serializable) или ничего (read commited). Просто смысла в repeatable read в текущей редакции oracle, ИМХО немного. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 14:55 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
softwarerNitro_JunkieРазве она не решается в 95% (а то и 100) установкой REPEATABLE READ в MSSQL (в обоих режимах), Postgres, Firebird и т.п. и перепроведением транзакции при deadlock \ update conflict'е ? Это не решение. Когда у Вас подтекает бачок в туалете (приложение создаёт ошибочные ситуации), проблема решается фиксингом бачка (исправлением багов в приложении), а не установкой в туалет ведра со шваброй (перезапуском транзакции). Здесь не черное и белое, как я уже говорил. Здесь вопрос в компромиссе между производительностью и целостностью. И REPEATABLE READ в среднем (!) лучше всего для этого подходит. Так что тут скорее мы фиксим бачок, он подтекает, но не так сильно, что никто особо и не замечает, если не присматривается. И не факт что его вообще можно починить. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 14:58 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkiesoftwarer2. Ничто, они, собственно, так и делают. Попробуйте воспроизвести свой пример в Oracle на уровне изоляции выше read committed, и Вас ожидает сюрприз :) Так ожидает или нет? А то тут 2 ветви дискуссии и в одной точно все уверены что нет. Никто не мешает набрать несколько строк SQL-я и увидеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 15:01 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkieно без поиска фантомов (так как это не всегда нужный overkill). Просто смысла в repeatable read в текущей редакции oracle, ИМХО немного. Для блокировочников поиск фантомов - дополнителная нагрузка. Для оракла (версионника) эмуляция блокировочников и включение фантомов в REPEATABLE READ - дополнителная нагрузка. Кому это нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 15:48 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
авторДля блокировочников поиск фантомов - дополнителная нагрузка. а пацаны то и не знают. пацаны просто предикаты блокируют. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 18:31 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieЗдесь не черное и белое, как я уже говорил. Здесь вопрос в компромиссе между производительностью и целостностью. И REPEATABLE READ в среднем (!) лучше всего для этого подходит. и особенно хорошо он подходит, что бы поставить систему раком. блокировки на любой чих просто задушат систему дедлоками. майкрософт долго подалась но факты были столь неумолимы, что пришлось признать, что версионный механизм гораздо лучше справляется с тяжелым OLTP и слизывать с оракла всю концепцию версионного механизма. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 23:01 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Yo.!майкрософт...слизывать с оракла всю концепцию версионного механизма.Полный неадекват ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2013, 23:41 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Yo.!Nitro_JunkieЗдесь не черное и белое, как я уже говорил. Здесь вопрос в компромиссе между производительностью и целостностью. И REPEATABLE READ в среднем (!) лучше всего для этого подходит. и особенно хорошо он подходит, что бы поставить систему раком. блокировки на любой чих просто задушат систему дедлоками. майкрософт долго подалась но факты были столь неумолимы, что пришлось признать, что версионный механизм гораздо лучше справляется с тяжелым OLTP и слизывать с оракла всю концепцию версионного механизма. А причем тут блокировки? REPEATABLE READ и с update conflict (как в postgres и firebird) может реализовываться. И строго гря update conflict'ы чаще чем deadlock'и. В любом случае просто "забить" как это предлагает оракл в его интерпретации REPEATABLE READ еще более идиотское решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 01:29 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, И кстати гря слизали они REPEATABLE READ с Postgres и Firebird, а не Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 01:32 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieNitro_Junkie, ... Да фиг с ней, с пятницей. Желаю тебе весело провести выходные в кругу друзей ) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 01:46 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
[quot hvladПолный неадекват[/quot] неадекват тут только ты, лабающий код не имея базовых знаний. Nitro_JunkieИ кстати гря слизали они REPEATABLE READ с Postgres и Firebird, а не Oracle. кстати говоря ты зря надуваешь щечки не имея элементарных знаний. во первых Firebird не умеет и половины того, что делает на версионных режимах мсскл (у ФБ нет версионного RC), во вторых мсскл как и оракл не смешивает данные и версии строк в одной структуре, что совершенно не похоже на FB/Postgres где версии перемешены с актуальными данными, со всеми вытекающими для перфоменса ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 01:52 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieNitro_Junkie, И кстати гря слизали они REPEATABLE READ с Postgres и Firebird, а не Oracle.Именно ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 02:07 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
hvladИменно Если не считать одной мелочи: Firebird-овский уровень изоляции по фамилии concurency гораздо выше стандартного repeatable read, который обеспечивает повторяемость только в пределах одного курсора. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 02:42 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
В общем, немного глубже изучив вопрос претензии к Oracle снимаются, у остальных серверов (и по стандарту) фактически разница между REPEATABLE READ и SERIALIZABLE не сильно отличаются (правда все равно нахрена oracle сделал такой странный REPEATABLE READ непонятно), так что у oracle можно просто юзать SERIALIZABLE, и будет почти тоже самое что у остальных. Но возник другой вопрос. Как уже отмечалось в многопользовательской среде есть фактически 2 стратегии : 1. пессимистичная - при высокой конкурентности и оверхедом на блокировки 2. оптимистичная - при низкой конкурентности и необходимостью заново перезапускать транзакции при конфликте Но в реальной жизни мир не черно-белый - для большинства данных (особенно справочных) естественно низкая конкурентность и блокировки будут overkill'ом (соответственно логично использовать REPEATABLE READ или SERIALIZABLE), в то же время в одной транзакции часть агрегированных данных могут быть высококонкурентными, как правило остатки, или например общий оборот по юрлицу (был у нас клиент который для оптимизации налогов, хотел иметь ограничение по обороту, и когда оно превышалось, хотел торговать по другой кассе). Соответственно что делать в этом случае непонятно. SELECT FOR UPDATE тут никак не поможет, потому как если с начала транзакции кто-то применит изменение на эти высококонкурентные данные (что очень вероятно), получится update conflict (учитываем что по умолчанию пессимистичный сценарий и соответствующий уровень изоляции). Единственное если переместить SELECT FOR UPDATE в самое начало, но тогда транзакции пойдут совсем последовательно, что мягко гря тоже не вариант. Что хотелось бы - это чтобы малая часть данных работали как у блокировочника (то есть читали не на начало транзакции, а на текущий момент с S-блокировкой), остальная же часть как у версионника (тут даже не критично читать на начало транзакции, главное проверять на update conflict). Так можно было бы ИМХО гарантировать максимальную параллельность (производительность), при достаточно небольших вероятностях нарушения целостности. Но я так понимаю так никто не умеет :(. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2013, 12:35 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkie, Кстати я так понимаю в SERIALIZABLE транзакции, даже UPDATE одним запросом не поможет, то есть если внутри двух долгих "параллельных" транзакций, сделают: UPDATE t SET a=a+2 WHERE key =5, UPDATE t SET a=a+4 WHERE key =5, сумма не увеличится на 6, а одна из транзакций откатится с update conflict'ом. Или я ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2013, 12:41 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkieнахрена oracle сделал такой странный REPEATABLE READ Где сделал? У Оракула нет REPEATABLE READ. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2013, 14:01 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovNitro_Junkieнахрена oracle сделал такой странный REPEATABLE READ Где сделал? У Оракула нет REPEATABLE READ. Ну, формально есть (он так называется у них). Просто работает, не как нормальный REPEATABLE READ. Но зато у них есть SERIALIZABLE, который покрывает возможности нормального REPEATABLE READ. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2013, 14:22 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieНу, формально есть (он так называется у них). Не знаю что там "формально", но для транзакции в Оракуле можно установить следующие уровни изоляции: READ COMMITTED, READ ONLY, SERIALIZABLE. Всё, список окончен. Никакого REPEATABLE READ в нём нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2013, 15:12 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZivЭ.. ммм... А если вы всё же РАЗНЫЕ поля данной записи будете менять ? Версии будут разные, получишь ты exception, транзакцию откатишь, и всё зря ? Дано У Иванова есть 100 долларов. 1 транзакция - меняет Иванова на Петрова. 2 - списывает у Петрова 10 долларов. Вопрос - должна ли транзакция молча списывать 10 долларов не у того? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2013, 13:32 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Сергей АрсеньевMasterZivЭ.. ммм... А если вы всё же РАЗНЫЕ поля данной записи будете менять ? Версии будут разные, получишь ты exception, транзакцию откатишь, и всё зря ? Дано У Иванова есть 100 долларов. 1 транзакция - меняет Иванова на Петрова. 2 - списывает у Петрова 10 долларов. Вопрос - должна ли транзакция молча списывать 10 долларов не у того? ты сначала докажи что не у того???? В этом примере как раз у того! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2013, 15:09 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
В общем-то единственное что раскопал, это то что в MS SQL, можно хинтами отдельные таблицы читать READCOMMITED, и при помощи этих же хинтов, вешать соответствующие блокировки. Но с другой стороны, если транзакция будет в "версионном" режиме то update conflict она кинет в любом случае :( Как говорят в таких случаях, пичалька :( ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2013, 20:31 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevДа, в данном случае, оптимистическую блокировку нужно реализовывать на клиенте. Мы можем обсудить данный вопрос в личке? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2013, 04:23 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Сергей АрсеньевMasterZivЭ.. ммм... А если вы всё же РАЗНЫЕ поля данной записи будете менять ? Версии будут разные, получишь ты exception, транзакцию откатишь, и всё зря ? Дано У Иванова есть 100 долларов. 1 транзакция - меняет Иванова на Петрова. 2 - списывает у Петрова 10 долларов. Вопрос - должна ли транзакция молча списывать 10 долларов не у того? Сергей, безусловно, пример с изменением первичного ключа таблицы — самый показательный и часто используемый в бд случай! Но я напомню, что транзакция изменения pk должна работать на уровне изоляции serializable. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2013, 19:44 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
MasterZivтранзакция изменения pk должна работать на уровне изоляции serializable. Собственно, к применению уровня изоляции ниже serializable нет никаких причин кроме кривизны конкретной СУБД. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2013, 20:26 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovСобственно, к применению уровня изоляции ниже serializable нет никаких причин кроме кривизны конкретной СУБД. и все таки пользователь ФБ это диагноз. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2013, 22:59 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
да серьезный ответ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 12:27 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
да серьезный ответ... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 12:28 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Yo.!Dimitry SibiryakovСобственно, к применению уровня изоляции ниже serializable нет никаких причин кроме кривизны конкретной СУБД. и все таки пользователь ФБ это диагноз. Вообще чисто теоретически он прав. Другой вопрос насколько у ФБ все хорошо в этом плане. Люди начинают юзать READ COMMITED и забивать на целостность, или делать ручные блокировки явно не от хорошей жизни :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 12:58 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieДругой вопрос насколько у ФБ все хорошо в этом плане. Лучше чем у остальных, поскольку read committed там появился только после того как на IB наложила лапу Borland, исключительно для совместимости с кривой архитектурой VCL. До этого практически единственным TIL был concurrency, который как раз и соответствует serializable. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:10 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovconcurrency, который как раз и соответствует serializableА ты не зарапортовался ??? Repetable read и serializable не перепутал ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:13 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovNitro_JunkieДругой вопрос насколько у ФБ все хорошо в этом плане. Лучше чем у остальных, поскольку read committed там появился только после того как на IB наложила лапу Borland, исключительно для совместимости с кривой архитектурой VCL. До этого практически единственным TIL был concurrency, который как раз и соответствует serializable. Ну если мериться concurrency, то тогда рулил бы вообще MSSQL с его READ_COMMITED_SNAPSHOT (так как нет оверхеда на чтение данных на начало транзакции). Другое дело что он update conflict'ы кидать не умеет. Понимаю что в этом случае с точки зрения целостности был бы немного мутант, но с точки зрения баланса concurrency - consistency ИМХО наилучший вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:20 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
hvladDimitry Sibiryakovconcurrency, который как раз и соответствует serializableА ты не зарапортовался ??? Repetable read и serializable не перепутал ? Там между ними вроде небольшая разница, не? Второй вроде как дополнительно предикаты умеет блокировать, и то ессно не в общем случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:21 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_Junkiehvladпропущено... А ты не зарапортовался ??? Repetable read и serializable не перепутал ? Там между ними вроде небольшая разница, не? Второй вроде как дополнительно предикаты умеет блокировать, и то ессно не в общем случае. Блокировать в смысле update conflict'ы кидать :) Не в смысле lock'ов как в блокировочнике... Хотя конечно надо еще почитать как у разных СУБД это реализовано. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:23 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
hvladА ты не зарапортовался ??? Repetable read и serializable не перепутал ? Нет. Если ораклятая дока в части описания стандартных TIL не врёт, то repeatable read описывает поведение двунаправленных курсоров (каковых, сам знаешь, нету) в пределах одного запроса, а serializable - поведение двух последовательных запусков одного и того же запроса. Nitro_JunkieНу если мериться concurrency, то тогда рулил бы вообще MSSQL с его READ_COMMITED_SNAPSHOT (так как нет оверхеда на чтение данных на начало транзакции). Во-первых, MS SQL начинался с dirty read, всё остальное ему навешали позже. Отсюда его странности в виде локов. Во-вторых, о каком таком оверхэде ты говоришь? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:34 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovhvladА ты не зарапортовался ??? Repetable read и serializable не перепутал ? Нет. Если ораклятая дока в части описания стандартных TIL не врётЯ про оракл ни слова не говорил. И ты тоже. Напомню твои слова целиком: Dimitry SibiryakovЛучше чем у остальных, поскольку read committed там появился только после того как на IB наложила лапу Borland, исключительно для совместимости с кривой архитектурой VCL. До этого практически единственным TIL был concurrency, который как раз и соответствует serializable.Так вот, concurrency в IB\FB никак не serializable. С serializable скорее можно сравнивать consistency, если уж так нужно найти аналог для serializable. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:39 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieВообще чисто теоретически он прав. Другой вопрос насколько у ФБ все хорошо в этом плане. у ФБ все печально не только в этом плане, но в абсолютно во всех других. Nitro_JunkieНу если мериться concurrency, то тогда рулил бы вообще MSSQL с его READ_COMMITED_SNAPSHOT (так как нет оверхеда на чтение данных на начало транзакции). с чего бы бледной копии на оракловый RC рулить ? на тему версионности оракл за последние 30 лет наделал столько фич, начиная с flashback, что мсскл еще не один десяток лет будет пытаться скопировать ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 13:56 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВо-первых, MS SQL начинался с dirty read, всё остальное ему навешали позже. Отсюда его странности в виде локов. Во-вторых, о каком таком оверхэде ты говоришь? О том что надо определить значение на начало транзакции, по идее для этого нужно больше логов прочитать :) чем если это делать в рамках одного statement'а. Ну локи кстати дают чуть большую целостность. Хотя конечно она не сравнится с оверхедом. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 14:03 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
hvladЯ про оракл ни слова не говорил. И ты тоже. Да. Но в его доке есть описание ANSI транзакций. Впрочем, если тебе не нравится ссылка на его доку, возьмём это: http://www.emanual.ru/download/www.eManual.ru_538.html#tab_1 Все три феномена невозможны уже на уровне concurrency, consistency уже оверкилл и его можно сравнивать только с Оракуловской реализацией serializable, которая превосходит по силе стандартную serizalizable тем, что выдаёт ошибки и там, где их не ожидаешь. Если прочитать описание феномена Phantom, то мы увидим "Если транзакция T1 повторит чтение с тем же предикатом <search condition>, то получит уже другой набор данных, отличный от полученного в первый раз", что никак не позволяет согласовать concurrency с repeatable read, где этот феномен разрешён. Кроме того, в данном случае (ПМСМ) "повторит чтение" - несколько неудачный перевод, который лучше заменить на "выполнит запрос заново". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 14:14 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieО том что надо определить значение на начало транзакции, по идее для этого нужно больше логов прочитать :) чем если это делать в рамках одного statement'а. Это у тебя сильно странная идея. Новая версия записи либо создана после savepoint, либо нет. Нет никакой разницы если этот savepoint уровня запроса или уровня транзакции. Что ещё больше упрощается если таки принять, что запросы вне транзакции (явной или неявной) не выполняются. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 14:23 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovNitro_JunkieО том что надо определить значение на начало транзакции, по идее для этого нужно больше логов прочитать :) чем если это делать в рамках одного statement'а. Это у тебя сильно странная идея. Новая версия записи либо создана после savepoint, либо нет. Нет никакой разницы если этот savepoint уровня запроса или уровня транзакции. Что ещё больше упрощается если таки принять, что запросы вне транзакции (явной или неявной) не выполняются. Тогда может я не совсем понимаю как реализуется "версионный" механизм. Если в системе регистрируются все savepoint'ы и при изменении записи, субд пробегается по всем savepoint'ам и сохраняет для них старое значение, оверхед будет за счет того, что в единицу времени будет больше "активных" savepoint'ов, которые нужно обновлять. Если СУБД определяет предыдущую версию по логам изменений, то тогда оверхед за счет того, что по большему количеству значений нужно пробежать. Вот никак не могу придумать механизм, чтобы не было оверхеда. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 15:03 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieВот никак не могу придумать механизм, чтобы не было оверхеда. http://ibase.ru/devinfo/mga.htm Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 15:56 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Nitro_JunkieВот никак не могу придумать механизм, чтобы не было оверхеда. он не существенен на фоне ожиданий на блокировках и оверхеда юлозаний в огромных списках блокировок (смотри результаты TPC-C). в оракле версии строк хранятся в UNDO, который практически наверняка будет в кеше, т.е. весь оверхед в оракле сведется к нескольким тактам процессора, на сравнение SCN транзакции и блока из кеша. поэтому и оракл ведет версионность на уровне блоков, а не строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 16:07 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Yo.!Nitro_JunkieВот никак не могу придумать механизм, чтобы не было оверхеда. он не существенен на фоне ожиданий на блокировках и оверхеда юлозаний в огромных списках блокировок (смотри результаты TPC-C). в оракле версии строк хранятся в UNDO, который практически наверняка будет в кеше, т.е. весь оверхед в оракле сведется к нескольким тактам процессора, на сравнение SCN транзакции и блока из кеша. поэтому и оракл ведет версионность на уровне блоков, а не строк. а забивать кэш версиями - это не оверхед, нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 16:14 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
авторв оракле версии строк хранятся в UNDO, а Оракл про это знает? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 17:00 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
Ivan Durakа забивать кэш версиями - это не оверхед, нет? что значит забивать ? он в кеш не зависимо от версионности приходит, на диск записать его не зависимо от версионности придется. и уходит он из кеша не зависимо от версионности. ScareCrowавторв оракле версии строк хранятся в UNDO, а Оракл про это знает? да, правильней версии блоков ... но блоки хранят версии строк в том числе. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2013, 18:08 |
|
Конфликт записи \ чтения
|
|||
---|---|---|---|
#18+
авторно блоки хранят версии строк в том числе. а ссылку на доку не дадите? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2013, 15:31 |
|
|
start [/forum/topic.php?all=1&fid=35&tid=1552413]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
104ms |
get tp. blocked users: |
1ms |
others: | 242ms |
total: | 434ms |
0 / 0 |