powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Блокировки MSSQL, Oracle, IB
22 сообщений из 47, страница 2 из 2
Блокировки MSSQL, Oracle, IB
    #32156629
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ну не надо неверсионкам лазить в редологи на селектах

а "версионкам" значит надо?

ЗЫ: и скока мона глупости говорить?
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32156932
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, конечно сегменты отката.
(Концепции. см Глава 10. Одновременный доступ к данным)
http://www.kuzbass.ru/docs/ora-rus-all/rdmbs-scm/7013scm.10
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157036
Zaxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Roman Ignatiev

>У IB нет блокировок, версионная структура.
....
>Две транзакции как правило спокойно могут изменить одну запись, не говоря >уже о чтении. И если одна из них сделает rollback - все будет в порядке,
>Разбор начинается при commit...

Поставил я IB (Firebird) ради проверки и получил нормальный логичный (для меня) результат:
Изменённая запись блокируется. При попытке изменить её другой сессией получаю: "Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements. lock conflict on no wait transaction. deadlock."
На чтение второй сессией, естественно, блокировка не влияет (на то она и многоверсионность).
По другому и быть не могло...
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157038
Merle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да что вы все, сговорились что-ли? А некто Action и Gt не одно лицо случаем?

Если по делу. Я так понимаю что к блокировочникам и MSSQL в частности 2 претензии:
1. Эскалация блокировок - suxx
2. А что собственно за минусы есть у версионников?

Отвечаю по порядку:
1 - эскалация вовсе на suxx, если посмотреть по ближе и разобраться что же это такое.
Для начала по поводу хинтов типа ROWLOCK. Ценность применения его сомнительна, потому как по дефолту и так накладывается Row Level Lock, в случае отсутствия благоприятных условий типа идущих подряд на всю страницу записей нуждающихся в блокировке, ясен перец, что Page Level Lock в этом случае рулит. А в случае неожиданной нехватки ресурсов ROWLOCK идет лесом и сервер все равно эскалирует блокировку до нужного уровня, чтобы все-таки обработать запрос, а не вывалиться с сообщением о нехватке ресурсов.
Далее по поводу дедлоков. Эскалация блокировок не может вызвать дедлок сама по себе, сколько бы транзакций не пыталось его провести одновременно на одну и ту же таблицу. По той простой причине, что эапрос на эскалирующую блокировку хитрый, он не ожидает, а сразу возвращает удалась блокировка или нет. Если удалась, то все хорошо, если не удалась - спокойно пыхтим дальше на прежнем уровне.
Эскалация блокировок может лишь спровоцировать дедлок потенциально опасных транзакций, которые без эскалации разошлись бы во времени или по записям, но рано или поздно при увеличении нагрузки дедлок все равно бы случился. Так что это уже ошибки проектирования и неча на сервер пенять, коли руки кривы.
Небольшая ремарка по поводу Оракла. Там эскалация не введена по той причине, что S блокировки и так табличные, меньше они не умеют, отсюда и ресурсов на блокировки в принципе меньше надо, а значит можно на этом с экономить ну и конкурентов блокировочников пнуть почти не по делу.

2. У версионников минусы примерно такие: (себя же цитирую) Например в версионнике очень сложно реализовать "по честному" Serialisable уровень изоляции. "не зная броду" можно очень легко привести базу в неконсистентное состояние. Что для грамтного разработчика конечно же не является проблемой, как в прочем и реализация беспрепятственного чтения в блокировочнике. Но в любом случае приходится идти на некоторые жертвы.
К примеру попытка в Oracle сделать транзакцию Serialisable в некоторых случаях приводит к снижению возможности параллельной обработки транзакций по сравнению с теми же MSSQL и DB2, отсюда и проигрыш в производительности в тяжелых OLTP приложениях с большим количеством R/W запросов.
Это если в краце, с примерами лень расписывать, если кому интересно покопайтесь....
(Ну или на http://www.rsdn.ru в форум с вопросами, я там чаще бываю, сюда по случаю только заглянул)
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157058
Zaxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SiDen

> При одинаковой реализации (предпологая что дураков нет в командах реализующих)теоретически версионки уступают в скорости.

Это да. А ещё многие СУБД теоретически уступят в скорости досовскому foxpro в локальном однопользовательском режиме. Поскольку последнему вообще не надо заботиться не об уровне изоляции не об транзакциях.
А на практике, как правило, минимальный режим изоляции пригодный для непротиворечивого представления информации и нормальной работы с данными это Read Commited и при многопользовательской работе с множеством чтений/записей в это режиме версионки своё возьмут.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157063
Zaxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Merle

>Небольшая ремарка по поводу Оракла.....S блокировки и так табличные, меньше они не умеют

Меньше и не требуется. В них в Оракле как раз не возникает необходимости. При чтении-то он данных не лочит.

>в версионнике очень сложно реализовать "по честному" Serialisable уровень изоляции.
В чём сложность ? Можно поподробнее?

> "не зная броду" можно очень легко привести базу в неконсистентное состояние.
Пример пожалуйста! Как это сделать в Oracle?

> Что для грамтного разработчика конечно же не является проблемой, как в прочем и реализация беспрепятственного чтения в блокировочнике.
>Но в любом случае приходится идти на некоторые жертвы.

Это да. Но для беспрепятственного чтения в блокировочнике жертвовать приходится гораздо большим - использовать Dirty Read. А это как раз приводит базу в "неконсистентное состояние".

>К примеру попытка в Oracle сделать транзакцию Serialisable в некоторых случаях приводит к снижению
> возможности параллельной обработки транзакций по сравнению с теми же MSSQL и DB2

А если в MSSQL и DB2 сделать транзакцию Serialisable это совершенно не приводит к снижению возможности параллельной обработки транзакций ???
В MSSQL даже Read Commited (что для Oracle нормальный режим) приводит к сильному снижению возможности параллельной обработки транзакций.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157127
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Zaxx: точно, а BerkeleyDB вообще рулеззз

ЗЫ: Хватит мерять кита со слоном... у одного уши длиньше, а у другого - хвост...
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157264
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Zaxx
Да, измененная запись блокируется, разумеется. Но все происходит не совсем так, как кажется - все зависит от параметров транзакции. Суда по всему, делал пробу через BDE?
Я еще немного и запутал :-)
Объясню подробнее - допустим, одна транзакция изменяет запись и стоит. Во второй транзакции изменяется эта же запись. Если у нее параметр wait - update будет ждать какое-то время (обычно 10 секунд), что сделает первая транзакция, если rollback - все пройдет нормально, commit или кончилось время - конфликт. Именно об этом я и говорил.
При nowait - вторая транзакция не ждет, выдает сразу.
При этом, если вторая транзакция read committed - она спокойно может повторить попытку после того, как первая завершилась, также все пройдет.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157272
Gt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gt
Гость
Да что вы все, сговорились что-ли? А некто Action и Gt не одно лицо случаем?
угу :) сговорились, правда не совсем одно но практически одно ...


> "не зная броду" можно очень легко привести базу в неконсистентное состояние.
Пример пожалуйста! Как это сделать в Oracle?

да у меня тоже чо то с фантазией туго ... можно пример ?

сейчас облазил ибм у них по этому поводу сказано лишь, что мы круче мсскл т.к. эскалацией можно управлять и дб2 быстрей оракла. оракл естественно грит, что версионник круче т.к. никто никого не ждет, но тактично молчит о скорости. ИМХО аргумент оракла пока красивей - смысл в скорости если база стоит ?
Т.е. клиенты получают отчеты через инет (много клиентов), им естественно нельзя сказать подождите и совсем нельзя давать им мешать операторам ... а как такого добится на дб2 ? надеятся, что клиенты будут успевать проскальзовать между блокировками как-то не серьозно ...

к стате оракл красиво рассматривает архитектурные различия (естественно в свою сторону), а ибм, чо то все на деньги перевела и сравнивает только лицензии и индексы.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157318
Zaxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Roman Ignatiev

>Да, измененная запись блокируется, разумеется.
Вначале вы вроде как говорили обратное
.
>Именно об этом я и говорил.
Вы говорили что: "Две транзакции как правило спокойно могут изменить одну запись.....Разбор начинается при commit...". Это по моему означает что: две сессии меняют одну запись а потом делают коммиты. Если они меняют её по очереди это уже совсем другое.

>Но все происходит не совсем так, как кажется - все зависит от параметров транзакции.
Пробовал в режиме Read Commited и Snapshot.

>Суда по всему, делал пробу через BDE?
Интерестно судя по чему? Нет, это нет так, делал в IBexpert, он работает без BDE.

Объясню подробнее - допустим...
Не надо объяснять. Я был против вашего поста про то что "в IB совсем нет блокировок". И Вы вроде как со мной уже согласились.

>Если у нее параметр wait - update будет ждать какое-то время
Где ставить параметр wait ?

>При этом, если вторая транзакция read committed - она спокойно >может повторить попытку после того, как первая завершилась
Как и в любой СУБД без IB-шной версионности.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157372
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Да, измененная запись блокируется, разумеется.
Вначале вы вроде как говорили обратное.

Говорил, был не прав, каюсь :-) Просто не приходилось сталкиваться с блокировкой на практике.


Вы говорили что: "Две транзакции как правило спокойно могут изменить одну запись.....Разбор начинается при commit...". Это по моему означает что: две сессии меняют одну запись а потом делают коммиты. Если они меняют её по очереди это уже совсем другое.

Неточно выразился, теоретически такое, кстати, возможно, практически - неподтвержденной может быть только одна версия записи. Подразумевалось - при wait идет ожидание, и если одна транзакция делает rollback, выражение второй проходит.

>Но все происходит не совсем так, как кажется - все зависит от параметров транзакции.
Пробовал в режиме Read Commited и Snapshot.
Snapshot уж точно выдаст deadlock - она не видит изменений после своего старта.

>Суда по всему, делал пробу через BDE?
Интерестно судя по чему? Нет, это нет так, делал в IBexpert, он работает без BDE.
У нее nowait по-умолчанию. IBExpert - также nowait, а у ISQL - wait.

Я был против вашего поста про то что "в IB совсем нет блокировок". И Вы вроде как со мной уже согласились.

Согласен. Есть. На конкурентное изменение.

>Если у нее параметр wait - update будет ждать какое-то время
Где ставить параметр wait ?

В IbExpert - Настройки -> свойства среды и там Транзакции. isc_tpb_wait. К базе нужно пересоединиться. Я обычно пользуюсь доступом через IBX для тестов, привычнее.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32157486
IBMer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GT: http://www-3.ibm.com/software/data/pubs/papers/
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32158528
Gt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gt
Гость
http://www-3.ibm.com/software/data/pubs/papers/readconsistency/readconsistency.pdf
^^^
наконец нашел внятный ответ, суть я так понял, медленно из-за лишних действий (что как бы проще посмотреть на tcp.org) и главное что юзер получает старые (неправильные) данные которые кто то уже меняет. однако потом они вспоминают про select for update и грят:

Note that this last example is the default behavior with DB2. That is, a
second transaction will wait for the first transaction to commit before it sees
changed data. That way you get current results not old results. If you do not
want to wait on a lock then there is the other ANSI standard isolation level
called uncommitted read which will see the current value of the data even if
that data is not yet committed.

т.е. юзая select for update я получаю те же уровни изоляции что и в дб2, но медленей (что сказывается на тяжелых OLPT ), а дб2 в свою очередь в ответ мультиверсионости предлагает грязное чтение.

я правильно понял ?
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32164640
IBMer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дорогой друг, Gt. Нет ты до конца не понял. Никого не интересуют как реализован у тебя ACID. Всех интересует сколько транзакций сможет обработать сервер за промежуток времени - это есть критерий выбора системы. А не ЖДЕТ или НЕ ЖДЕТ читатель писателя это уже не столь важно.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32165010
Gt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gt
Гость
мда фокс тогда бы рулил, он знаешь скока могет :) всех интересуют данные, правильные данные, а скорость уже в последнюю очередь (после надежности и возможностей).

элементарно мы даем select и получаем разные ответы ! оракл по дефолту не будет ждать всех комитов, дб2 будет - в результате разные ответы на один запрос, это небходимо учитывать.

и все таки, я так и не понял как поступит дб2: select * на маленькую табличку которую круглосуточно апдейтят, т.е. в любой момент времени данные таблички модифицируются. То что менеждер блокировок там крутой, эт я уже слышал, меня интеречует как ? Стопорнет все апдейты и пропихнет селект ?
И еще, вебная апликуха - тысячи юзеров, все только читают и при этом получается блокируют, дальше кто то открыл карточку (заблокировал пару записей) и уснул ... что будет с вебными юзерами ?
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32171105
IBMer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>элементарно мы даем select и получаем разные ответы ! оракл по дефолту не >будет ждать всех комитов, дб2 будет - в результате разные ответы на один >запрос, это небходимо учитывать.

И оба этих результата не будут верны уже через минуту. Уже будут другие данные и что.

>и все таки, я так и не понял как поступит дб2: select * на маленькую >табличку которую круглосуточно апдейтят, т.е. в любой момент времени >данные таблички модифицируются. То что менеждер блокировок там крутой, >эт я уже слышал, меня интеречует как ? Стопорнет все апдейты и пропихнет >селект ?
Ну и стопорнет. Oracle надо будет страничку новую создать, это тоже время не забывай.

>И еще, вебная апликуха - тысячи юзеров, все только читают и при этом
>получается блокируют, дальше кто то открыл карточку (заблокировал пару
>записей) и уснул ... что будет с вебными юзерами ?

У каждая блокировка характеризуется набором атрибутов которым можно управлять.

А ситуация про Web которую ты описал извини но это кривоватые руки разработчика.
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32173200
Gt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gt
Гость
Ну и стопорнет. Oracle надо будет страничку новую создать, это тоже время не забывай.
какую страничку ??? ты имел ввиду сегмент отката, так и дб2 он нужен наверно ...

ОК, с вебной криво, но блин я побозреваю, что такое наследство досталось не только мне ... тогда вот такой пример, как такое надо было правильно делать ? (п.с. пример ораклоида, в дб2 он врядле силен)


ok, say you have a 3 "page" or 3 block table. pretend there is 1 row / block.
assume the values are:

ACCT BALANCE ACCT_TYPE
---- ------- ---------
1 500 savings
2 100 savings
1 1000 checking


Obviously -- there is 1600 in the bank there right? Assume the following
operations and we are using the default DB2 isolation "read committed". What we
need to do is report back "how much money is in the bank". At the same time --
we need to process transactions

time operation by query operation by update
------ ------------------------- -----------------------
t1 start query, read block 1
running total = 500, while
reading -- we have a shared
read lock on the block

t2 account 1 pulls up to ATM
and tries to take 400 from
checking (block 1) but has to
wait -- query has block 1 shared
locked and we need it exclusive

t3 query finished with block 1, released
shared lock, moved onto block 2, running
total = 600

t4 we get exclusive lock on block 1
and change the value to 100.


t5 we are actually doing a transfer,
so now we get block 3 and add
400 to it. block 3 has an
exclusive lock on it.

t6 give up block 2, try to move onto
block 3. we cannot - so we wait...

t7 we commit -- releasing block 3

t8 move onto block 3, read 1400 -- add
to 600 and report back the answer
"there be 2,000 in the bank!", hmmm



There are other interesting scenarios -- say you want a consistent read -- a
correct answer. In db2 -- that is "repeatable read", they achieve that by
LEAVING the shared locks on as they read it. So, it the above timeline, the
query would have blocked the update until the query finished and committed.
Given that block 2 really could represent a TON of blocks in the example, that
could be a while (no atm transactions for you)... Or even better if the data
were organized:

ACCT BALANCE ACCT_TYPE
---- ------- ---------
1 1000 checking
2 100 savings
1 500 savings


now what happens is:

query starts -- gets and keeps shared lock on block 1 (1000,checking). Update
starts -- gets x-lock on block 3 (500,savings -- updated to 100,savings) and
keeps it.

query keeps running....

update tries to get block 1 but cannot, query has it locked. update blocks.

query runs and gets to block 3, cannot get a shared lock.

We now have a deadlock. In order to get the right answer, we had to lock, but
by locking -- we deadlock. catch 22 -- what do we do?


This is why db2 supports dirty read (forget about locks, what a waste of time
right? who cares if you get the right answer, just blow through them).
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32246728
bgru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Gt

http://rsdn.ru/Forum/?mid=363428
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32248630
Gt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gt_
Гость
2bgru\r
\r
/topic/45859
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32251822
bgru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Gt_

Ну в итоге они согласились с http://rsdn.ru/Forum/?mid=363428
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32255238
bgru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Блокировки MSSQL, Oracle, IB
    #32255271
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищу Мерле\r
\r
/topic/12853&pg=4
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Блокировки MSSQL, Oracle, IB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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