powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Откуда блокировки на версионниках?
50 сообщений из 50, показаны все 2 страниц
Откуда блокировки на версионниках?
    #37215507
СУБД можно условно разделаить на два вида блокировочники и версионники.
Блокировочники для изоляции транзакций накладывают блокировки, а версионники хранят версии актуальных данных для транзакции.
Но зачастую в разговоре о версионниках говорят про блокировки, не совсем понимаю откуда если это версионник?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37215548
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от сервера.
На Firebird под блокировками обычно подразумевают конфликты обновлений.
Если транзакция A изменила запись но транзакция не завершена то в транзакции B эту же запись изменить уже нельзя.
Ну и еще масса тонкостей про блокирование от изменений читай про уровни изоляции транзакций, причем не абстрактно а именно про Firebird ибо у каждого сервера в этом месте свои тонкости.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37215702
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже версионник использует блокировки для обеспечения одновременного доступа к данным. Они используются чтобы в каждый момент времени только одна транзакция могла изменять конкретные данные.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216007
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronДаже версионник использует блокировки для обеспечения одновременного доступа к данным.

Точнее будет сказать - для синхронизации доступа к общим/глобальным объектам. Это
необязательно данные.

Аффтар, почитай хоть что-нибудь про программирование многопоточных приложений. Того же
Рихтера, например.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216077
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭто необязательно данные.
а что? Оо
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216088
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев Фёдора что? Оо
Метаданные, файловые ресурсы, коммуникации...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216118
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 14.04.2011 4:30, версионник wrote:
> СУБД можно условно разделаить на два вида блокировочники и версионники.
> Блокировочники для изоляции транзакций накладывают блокировки, а версионники
> хранят версии актуальных данных для транзакции.
> Но зачастую в разговоре о версионниках говорят про блокировки, не совсем понимаю
> откуда если это версионник?

Две модификации одной и той же строки в разных транзакциях будут друг друга
блокировать ДАЖЕ В ВЕРСИОННИКЕ. Если они это не будут делать, будет проблема
(аномания), именуемая write skew, можешь про неё прочитать в той же википедии.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216218
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой пример в версионнике с двумя транзакциями TX1 и TX2 которые обновляют запись N1

TTX1TX21 обновляет запись N1 -2-пытается обновить N1 - ждет снятия блокировки3commit-4-обновила запись N1
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216223
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronПростой пример в версионнике

Это не в версионнике, это в Оракуле.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216553
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, в postgres так же.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216618
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и у майкрософт на версионных уровнях так же, ФБ как всегда особенный :)
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216638
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, да, вот так молча грохнуть чужие изменения... Суровый этот мейнстрим...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216642
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа, да, вот так молча грохнуть чужие изменения... Суровый этот мейнстрим...

ну... в этом как бы суть любого апдэйта
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216669
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев ФёдорDimitry SibiryakovДа, да, вот так молча грохнуть чужие изменения... Суровый этот мейнстрим...

ну... в этом как бы суть любого апдэйтаМожет таки огласим сначала уровень изоляции tx2 ?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216695
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа, да, вот так молча грохнуть чужие изменения... Суровый этот мейнстрим...


MS SQL

In a read-committed transaction using row versioning , the selection of rows to update is done using a blocking scan where an update (U) lock is taken on the data row as data values are read. This is the same as a read-committed transaction that does not use row versioning. If the data row does not meet the update criteria, the update lock is released on that row and the next row is locked and scanned.

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.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216734
AndronПростой пример в версионнике с двумя транзакциями TX1 и TX2 которые обновляют запись N1

TTX1TX21 обновляет запись N1 -2-пытается обновить N1 - ждет снятия блокировки3commit-4-обновила запись N1

А если допустим между Т1 и Т2 влезла ещё одна транзакция Т3, которая изменила данные, то Т1 их просто не увидит и произведет свои изменения без учета Т3?
TTX1TX2TX30 - - старт транзакции1 старт транзакции - -2читает V1 - читает V13 - (читает что-то ещё) - меняет V14 - - commit5 - старт транзакции -6 - меняет V1 -7 - commit -8 меняет V1 - -9 commit - -
Т.е. ни изменения Т3, ни изменения Т2 учтены не буду относительно V1?

Dimitry SibiryakovДа, да, вот так молча грохнуть чужие изменения... Суровый этот мейнстрим...

А на Firebird будет deadlock?
И на всех уровнях изоляции?

Dimitry SibiryakovЗайцев Фёдора что? Оо
Метаданные, файловые ресурсы, коммуникации...

Сиквенсы например.
А метаданные, в частности для структур таблиц ни в одной СУБД не используются версии?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216779
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионник...
А если допустим между Т1 и Т2 влезла ещё одна транзакция Т3, которая изменила данные, то Т1 их просто не увидит и произведет свои изменения без учета Т3?
TTX1TX2TX30 - - старт транзакции1 старт транзакции - -2читает V1 - читает V13 - (читает что-то ещё) - меняет V14 - - commit5 - старт транзакции -6 - меняет V1 -7 - commit -8 меняет V1 - -9 commit - -
Т.е. ни изменения Т3, ни изменения Т2 учтены не буду относительно V1?

...


Ключевой вопрос здесь "как читает TX1 или TX3 в момент 2" (для простоты будем считать что TX2 прочитала раньше чем TX3): если будет произведено чтение for update то ни одна другая транзакция после этого момента и до коммита TX1 изменить запись V1 не сможет.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37216810
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 14.04.2011 13:57, Dimitry Sibiryakov wrote:
> Это не в версионнике, это в Оракуле.

Оракул версионник.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217069
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникА если допустим между Т1 и Т2 влезла ещё одна транзакция Т3, которая изменила данные, то Т1 их просто не увидит и произведет свои изменения без учета Т3?
TTX1TX2TX30 - - старт транзакции1 старт транзакции - -2читает V1 - читает V13 - (читает что-то ещё) - меняет V14 - - commit5 - старт транзакции -6 - меняет V1 -7 - commit -8 меняет V1 - -9 commit - -
Т.е. ни изменения Т3, ни изменения Т2 учтены не буду относительно V1?

вообще-то если не отдельно читать/ отдельно менять, а "менять, читая", одним стейтментом ~
Код: plaintext
SET t.x=t.x+delta
то в момент 8 при read commited T1 должна прочитать все закоммиченные на этот момент изменения в t.x. и их и наварить. мне кааца.

А если провернуть всё в одном стейтменте не удается - то читать надо FOR UPDATE , как подсказывают.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217121
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев Фёдорну... в этом как бы суть любого апдэйта

И ведь что самое забавное: если я сейчас начну рассуждать о репликации и скажу, что при
изменении одних и тех же данных на двух серверах, одно из изменений будет молча затёрто
другим, то эти же самые люди будут кричать, что это абсолютно неправильно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217293
1chainikвообще-то если не отдельно читать/ отдельно менять, а "менять, читая", одним стейтментом ~
Код: plaintext
SET t.x=t.x+delta
то в момент 8 при read commited T1 должна прочитать все закоммиченные на этот момент изменения в t.x. и их и наварить. мне кааца.

А если провернуть всё в одном стейтменте не удается - то читать надо FOR UPDATE , как подсказывают.
Т.е. правильно понимаю, что даже в версионнике в двух транзакциях используя FOR UPDATE можно получить deadlock при read commited, а при Serializable и без FOR UPDATE?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217304
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadlock и update conflict это две большие разницы вообще-то...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217342
Dimitry Sibiryakovdeadlock и update conflict это две большие разницы вообще-то...

А в чем именно разница, насколько я понимаю в обоих случаях одна из транзакций наименее затратная уйдет с rollback'ом.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217346
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 14.04.2011 21:29, версионник wrote:

> Т.е. правильно понимаю, что даже в версионнике в двух транзакциях используя FOR
> UPDATE можно получить deadlock при read commited,
Да

а при Serializable и без FOR
> UPDATE?

DEADLOCK вообще можно получить всегда. В любой СУБД, на любом уровне изоляции.
(изменение данных работает на самом минимальном уровне изоляции, меньше 0,
так что уровни тут вообще ни при чём).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217365
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникнасколько я понимаю в обоих случаях одна из транзакций наименее затратная уйдет с rollback'ом.

Нинасколько ты не понимаешь. Update conflict это штатная ошибка параллельного апдейта.
Deadlock это нештатная ситуация взаимного ожидания. При первом никакой взаимности нет.
Второй всегда обломится (если первый не откатится добровольно).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217409
Dimitry Sibiryakovверсионникнасколько я понимаю в обоих случаях одна из транзакций наименее затратная уйдет с rollback'ом.

Нинасколько ты не понимаешь. Update conflict это штатная ошибка параллельного апдейта.
Deadlock это нештатная ситуация взаимного ожидания. При первом никакой взаимности нет.
Второй всегда обломится (если первый не откатится добровольно).

Update conflict возникает когда одна транзакция изменяет строку которая уже была изменена другой транзакцией во время выполнения первой?
Deadlock возникает из-за взаимного ожидания.
FOR UPDATE - накладывает блокировку?

Т.е.
- транзакция стейтмент1 Т1 SELECT id FROM table WHERE id = 5 FOR UPDATE2 Т2 SELECT id FROM table WHERE id = 10 FOR UPDATE3 Т1 SELECT id FROM table WHERE id = 10 FOR UPDATE4 Т2 SELECT id FROM table WHERE id = 5 FOR UPDATE5 T1 UPDATE table SET id = 10 WHERE id = 56 T2 UPDATE table SET id = 5 WHERE id = 107 T1 COMMIT8 T2 COMMIT
В данном случае при Read Commited на какой строке обломиться и по причине Update conflict или Deadlock?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217421
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордаже в версионнике в двух транзакциях используя FOR UPDATE можно получить deadlock при read commited, а при Serializable и без FOR UPDATE?Дедлок вы получите всегда, независимо от уровня изолированности транзакции, если коннект_1 заблокировал строку_1 и хочет заблокировать строку_2, а коннект_2 заблокировал строку_2 и пытается заблокировать строку_1.
Куда важнее другое:
1) приведет ли вывал сообщения о дедлоке в одном из окон к АВТОМАТИЧЕСКОМУ снятию блокировок, которое оно установило перед этим, и след-но, к возможности ДРУГИХ окон (НЕ "жертв") продолжить свою работу;
2) что в итоге будет записано в таблицу, строки которой оказались "втянуты в конфликт"

Результаты, получаемые в Firebird при возникновении дедлоков, зависят не только от действий сервера! Крайне важно и то, как спроектировано клиентское приложение, реагирует ли оно вообще на получаемые ошибки и откатывает ли ПОЛНОСТЬЮ проделанные изменения.
Прочтите вот эту статью: http://www.ibase.ru/devinfo/savepoints.htm

И проведите затем нижеследующий эксперимент (я делал с уровнем = RC, попробуйте SNAPSHOT - будет тоже самое):
DDL:
Код: plaintext
1.
2.
3.
4.
recreate table tmp(id int not null primary key, val int);
commit;
insert into tmp values( 1 , 1 );
insert into tmp values( 1 , 2 );
commit;

Сценарий 1_a.
W1: isql -n test.fdb
W2: isql -n test.fdb
W1: commit; set transaction read write read committed NO RECORD_VERSION wait;
W2: commit; set transaction read write read committed NO RECORD_VERSION wait;
W1: update tmp set val=val*10 where id=1;
W2: update tmp set val=val*1000 where id=2;
W1: update tmp set val=val*10 where id=2;
W2: update tmp set val=val*1000 where id=1;
/* через 10 сек (по дефолту, см. firebird.conf, параметр DeadlockTimeout) в одном из окон вывалится сообщение:
Код: plaintext
1.
Statement failed, SQLSTATE = 40001
deadlock

ВНИМАНИЕ: вывод этого сообщения НЕ является завершением транзакции! Она в этом окне всё еще активна.
В другом окне НИКАКОГО действия произведено не будет до тех пор, пока в "аварийном" не будет выдано COMMIT или ROLLBACK; там идёт БЕСКОНЕЧНОЕ ожидание завершения транзакции в "аварийном" окне.
В моём случае "авария" произошла в ПЕРВОМ окне, W1.
*/
W1: commit; // по-хорошему, надо конечно делать ROLLBACK. Но мы "поиздеваемся" и проверим, что будет в итоге :-)
W2: управление в окне МОЛЧА вернулось к подсказке "SQL>" , НИКАКИХ сообщений выведено не было.
Смотрим в этом же кне, что сейчас в таблице:
W 2 : SELECT * FROM TMP;
Result:
Код: plaintext
1.
2.
3.
           ID          VAL
============ ============
           1        10000
           2         2000 
W2: COMMIT;

ВЫВОД. В этом режиме транзакция, в которой НЕ было "аварии", действительно может после обнаружения сервером дедлока провести обновление ВСЕХ ("ЧУЖИХ") записей, которые были заняты. "Аварийный" же сеанс, свалившийся на N-ом операторе с начала транзакции (в этом сценари - на втором операторе), сможет зафиксировать только действия, выполненные (N-1) ПРЕДЫДУЩИМИ операторами.

Сценарий 1_b.
W1: isql -n test.fdb
W2: isql -n test.fdb
W1: commit; set transaction read write read committed NO RECORD_VERSION wait;
W2: commit; set transaction read write read committed NO RECORD_VERSION wait;
W1: update tmp set val=val*10 where id=1;
W2: update tmp set val=val*1000 where id=2;
W1: select * from tmp;
/*
Теперь окно_1 будет БЕСКОНЕЧНО долго висеть в ожидании высвобождения блокировки, установленной на строку с ID=2 окном_2.
Эта ситуация НЕ является дедлоком: W1 не пытается установить блокировку, оно просто хочет прочитать незакоммиченные данные, находясь в транзакции, настройки которой явно ЗАПРЕЩАЮТ это делать.
ИМХО, всё-таки сообщение сервер здесь мог бы выдать, так же через время, определяемое параметром DeadLockTimeout (только убрать бы из его названия слово "Dead" - и всё будет выглядеть вполне логично :))
*/

Сценарий 2_a.
W1: isql -n test.fdb
W2: isql -n test.fdb
W1: commit; set transaction read write read committed RECORD_VERSION wait;
W2: commit; set transaction read write read committed RECORD_VERSION wait;
W1: update tmp set val=val*10 where id=1;
W2: update tmp set val=val*1000 where id=2;
W1: update tmp set val=val*10 where id=2;
W2: update tmp set val=val*1000 where id=1;
/*
Также через 10 секунд в одном из окон появится сообщение о дедлоке, но уже более информативное:
Код: plaintext
1.
2.
3.
4.
Statement failed, SQLSTATE = 40001
deadlock
-deadlock
-update conflicts with concurrent update
-concurrent transaction number is 118
В моём случае это опять оказалось окно W 1 . Транзакция в это окне НЕ завершена - так же, как и в предыдущем сеансе.
Управление во ВТОРОМ окне (НЕ "аварийном", также как ранее, НЕ возвращается к подсказке "SQL> " - оно будет висеть бесконечно, до тех пор пока в первом окне не будет завершена транзакция
*/

W1: COMMIT ; // опять будем проверять этот случай, а не ROLLBACK :-)
W2: Вместо "молчаливого" возврата управления к подсказке появилось сообщение:
Код: plaintext
1.
2.
3.
Statement failed, SQLSTATE = 40001
deadlock
-update conflicts with concurrent update
-concurrent transaction number is 116
- и только после него появилась подсказка "SQL >"
W2: COMMIT;
W1 (или W2): SELECT * FROM TMP;
Result:
Код: plaintext
1.
2.
3.
           ID          VAL
============ ============
           1           10
           2         2000 

А теперь сравниваем эти данные с теми, что были получены в сценарии 1_а.

ВЫВОД 2_а. Даже если транзакция не оказалась в роли "жертвы" (т.е. сообщение о дедлоке появилось сначала в ДРУГОМ окне), она всё равно в итоге НЕ сможет провести свои изменения в полной мере . Изменена только строка с ID=2, т.е. та, которая была СРАЗУ (без конфликтов) заблокирована с самого начала этой транзакции.
В чём причина этого ? В том, что когда "аварийное" окно W1 получило сообщение о дедлоке, оно упрямо закоммитило изменения, которые выполняло предыдущим оператором. Это было изменение строки с ID=1. Именно этот коммит и послужил обломом для "нормального" окна W2 - см. ниже, сценарий 2_b.

Сценарий 2_b.
W1: isql -n test.fdb
W2: isql -n test.fdb
W1: commit; set transaction read write read committed RECORD_VERSION wait;
W2: commit; set transaction read write read committed RECORD_VERSION wait;
W1: update tmp set val=val*10 where id=1;
W2: update tmp set val=val*1000 where id=2;
W1: update tmp set val=val*10 where id=2;
W2: update tmp set val=val*1000 where id=1;
/*
Снова через 10 секунд в окне W1 появится сообщение о дедлоке:
Код: plaintext
1.
2.
3.
4.
Statement failed, SQLSTATE = 40001
deadlock
-deadlock
-update conflicts with concurrent update
-concurrent transaction number is 125
*/
W1: ROLLBACK;
W2: а вот теперь никакого сообщения о дедлоке нет (в отличие от сценария 2_а) и управление "молча" вернулось к подсказке "SQL >"
W2: COMMIT; SELECT * FROM TMP;
Result:
Код: plaintext
1.
2.
3.
           ID          VAL
============ ============
           1         1000
           2         2000 
ВЫВОД 2_b. Если возник дедлок и некоторое окно оказалось выбрано сервером "жертвой", то другое окно, заинтересованное в данных этой "жертвы", сможет обновить их ТОЛЬКО при условии, что "жертва" выполнила ROLLBACK.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217424
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникFOR UPDATE - накладывает блокировку?

В Оракуле - накладывает, в Жар-Птице - нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217426
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникВ данном случае при Read Commited на какой строке обломиться и по причине Update conflict или Deadlock?На третьей строке, при условии что эта транзакция (T1) запущена с параметром RECORD_VERSION, она получит облом через 10 сек.
Если же она запущена с параметром NO RECORD_VERSION, то будет бесконечное ожидание.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217464
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЕсли же она запущена с параметром NO RECORD_VERSION, то будет бесконечное ожидание.

Перестал бы ты использовать кривые уровни изоляции только потому, что их поведение
напоминает Оракула... Read Committed - наше всё!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217465
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЕсли же она запущена с параметром NO RECORD_VERSION, то будет бесконечное ожидание.

Перестал бы ты использовать кривые уровни изоляции только потому, что их поведение
напоминает Оракула... Repeatable Read - наше всё!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217466
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, шибко быстро отправляются сообщения...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217474
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидЕсли же она запущена с параметром NO RECORD_VERSION, то будет бесконечное ожидание.

Перестал бы ты использовать кривые уровни изоляции только потому, что их поведение
напоминает Оракула... Read Committed - наше всё!
я всего лишь показал ТС'у, какие будут эффекты :-)
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217567
Dimitry SibiryakovверсионникFOR UPDATE - накладывает блокировку?

В Оракуле - накладывает, в Жар-Птице - нет.

А в жар-птице что происходит если не блокировка?

Таблоид
Код: plaintext
1.
2.
3.
4.
Statement failed, SQLSTATE = 40001
deadlock
-deadlock
-update conflicts with concurrent update
-concurrent transaction number is 125
*/

А говорили deadlock и update conflicts разные вещи :)


ТаблоидверсионникВ данном случае при Read Commited на какой строке обломиться и по причине Update conflict или Deadlock?На третьей строке, при условии что эта транзакция (T1) запущена с параметром RECORD_VERSION, она получит облом через 10 сек.
Если же она запущена с параметром NO RECORD_VERSION, то будет бесконечное ожидание.
А решение о том какая транзакция считается "аварийной" Firebird принимает на основе графа блокировок или как-то ещё?

Кстати, а во всех СУБД обработка deadlock-ов и принятие решений об откате транзакции происходит на стороне клиента?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217611
Кстати, версии данных в версионниках создаются только при DML?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217771
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникКстати, версии данных в версионниках создаются только при DML?в ФБ версии создаются только при insert, update(merge) и delete. В случае с апдейтом поля на то же значение, которое в нём было до этого записано, версия не создастся. Селект версию тоже не создаст. Наглядно про версии рассказано тут .
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37217865
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ случае с апдейтом поля на то же значение, которое в нём было до этого записано, версия не создастся. Создастся, не путай людей.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218001
1chainik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионник Т.е. правильно понимаю, что даже в версионнике в двух транзакциях используя FOR UPDATE можно получить deadlock при read commited, а при Serializable и без FOR UPDATE?PostgreSQL, если я правильно помню, на уровне Serializable просто выдаёт второму ошибку попытки доступа к изменяемому Serializable данному. Это совсем таки не дедлок. (редко что-то на Serializable тестирую, никогда не использую. могу врать, в смысле произвести т.н. "перенос").

Ну а для сокращения ожиданий на read commited еще есть ключик "NO WAIT" [дедлока с таким ключом тем паче не будет]. там, запрашивающему с ключом "NO WAIT" уже залоченное кем-то данное, придёт ошибка, которую он может аккуратно обработать.

а вот с апдейтом UNIQUE кляуза NO WAIT как-то плохо скрещена. там вероятно можно попробовать подвесить напрочь.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218012
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно помню у файерберда индексы не версионны... или обшибся??
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218021
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникА говорили deadlock и update conflicts разные вещи :)

"Если на клетке слона написано буйвол..."
Оставим кривое сообщение об ошибке на совести его автора.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218069
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakЕсли я правильно помню у файерберда индексы не версионны... или обшибся??Не ошибся. А как это связано с предыдущим обсуждением ?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218223
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladIvan DurakЕсли я правильно помню у файерберда индексы не версионны... или обшибся??Не ошибся. А как это связано с предыдущим обсуждением ?
ну тогда при апдейтах индекса вообще файрберд аки блокировочник работает. Получается
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218256
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakну тогда при апдейтах индекса вообще файрберд аки блокировочник работает. ПолучаетсяОткуда получается ???
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37218450
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakЕсли я правильно помню у файерберда индексы не версионны... или обшибся??
вопрос некорректный. в индексе находятся все ключи от всех версий. Но, в ключе нет информации о транзакции, его создавшей.
поэтому ответ на заданный вопрос: индексы в ФБ - версионны.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37219461
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 15.04.2011 12:17, 1chainik wrote:

> PostgreSQL, если я правильно помню, на уровне Serializable просто выдаёт второму
> ошибку попытки доступа к изменяемому Serializable данному. Это совсем таки не
> дедлок. (редко что-то на Serializable тестирую, никогда не использую. могу
> врать, в смысле произвести т.н. "перенос").

Ребята, конфликты UPDATE-ов будут проявляться ВСЕГДА, потому что все
меняющие данные транзакции как минимум работают на самом низком уровне
изоляции -- WRITE COMMITTED, ниже которого ВООБЩЕ НЕ БЫВАЕТ. Это самый низкий
уровень изоляции, в ANSI стандарте его нет (именно потому, что ниже него не
бывает). Поэтому уровни изоляции тут совершенно ни при чём -- все ANSI-шные
уровни изоляции ВЫШЕ самого низкого WRITE COMMITTED, поэтому проблемы
взаимодействия нескольких писателей будут проявляться на всех ANSI-шных уровнях
изоляции одинаково.

Исключение (точнее оговорка, поскольку это не ансишное поведение) -- это
проблема lost update/write skew. Если в СУБД эта проблема проявляется, то
вообще говоря эту СУБД надо выбрасывать. Но к счастью СУБД такая вроде бы
только одна -- IB/FB, и в ней это вроде бы уже починили давно (знатоки FB
может меня поправят).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37219532
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivпроблема lost update/write skew. Если в СУБД эта проблема проявляется, то вообще говоря
эту СУБД надо выбрасывать. Но к счастью СУБД такая вроде бы только одна -- IB/FB, и в ней
это вроде бы уже починили давно (знатоки FB может меня поправят).

Вообще-то чуть выше уже показали, что таких СУБД целых две: Oracle и PostgreSQL. А в
Firebird потерянных апдейтов никогда не было. Она изначально выдаёт ошибку при update
conflict. За исключением одного совершенно безумного режима транзакции, который используют
разве что выходцы с Оракула именно за то, что там чужие изменения молча затираются.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37219542
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

насчёт write skew.

Насколько я вижу, в ещё не вышедшем PG 9.1 будет введён новый уровень изоляции Serializable Snapshot.
Так что не нужно баек про единственный и плохой FB.

А как обстоят дела у Oracle\MSSQL\DB2 ? Желательно ссылки, а не рассказки, плс.
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37219937
hvladMasterZiv,

насчёт write skew.

Насколько я вижу, в ещё не вышедшем PG 9.1 будет введён новый уровень изоляции Serializable Snapshot.
Так что не нужно баек про единственный и плохой FB.

А как обстоят дела у Oracle\MSSQL\DB2 ? Желательно ссылки, а не рассказки, плс.
А вот цитировали для MS SQL не оно?
Откуда блокировки на версионниках?
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37220016
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версионникА вот цитировали для MS SQL не оно?
Откуда блокировки на версионниках? Не оно
...
Рейтинг: 0 / 0
Откуда блокировки на версионниках?
    #37225647
interesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladMasterZiv,

насчёт write skew.

Насколько я вижу, в ещё не вышедшем PG 9.1 будет введён новый уровень изоляции Serializable Snapshot.
Так что не нужно баек про единственный и плохой FB.




http://www.pgcon.org/2011/schedule/events/333.en.html It adds a new type of lock that's used to track read dependencies and roll back transactions when dangerous structures appear in the serialization graph, indicating possible anomalies.


ИМХО попытка меньше греть воздух .

hvladА как обстоят дела у Oracle\MSSQL\DB2 ? Желательно ссылки, а не рассказки, плс.


http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/consist.htm

Database ConceptsDatabase permits a serializable transaction to modify a data row only if it can determine that prior changes to the row were made by transactions that had committed when the serializable transaction began.

To make this determination efficiently, Oracle Database uses control information stored in the data block that indicates which rows in the block contain committed and uncommitted changes. In a sense, the block contains a recent history of transactions that affected each row in the block. The amount of history that is retained is controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE.

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



тут уже есть :
http://download.oracle.com/docs/cd/E11882_01/timesten.112/e14261/concurrent.htm
In-Memory Database Cache Introduction When an application uses serializable isolation, locks are acquired within a transaction and are held until the transaction commits or rolls back for both reads and writes. This level of isolation provides for repeatable reads and increased isolation within a transaction at the expense of decreased concurrency.
...
Рейтинг: 0 / 0
50 сообщений из 50, показаны все 2 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Откуда блокировки на версионниках?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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