|
|
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Таблоид чё-чё ? дык инсерты там вообще не причем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 16:57:21 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Самый безопасный метод - это одни инсерты без апдейтов, но он же наиболее неудобный. В текущей ситуации порекомендовал бы сделать транзакции no wait и ловить исключения concurrent update, в случае ошибки повторять запрос либо идти на выход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 17:04:29 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
dimitrдык инсерты там вообще не причемА, нашёл. Это в личку ты прислал, 12-ноя-2013 19:51 (тема письма: "Нагрузочный тест: lock conflict'ы в базе, в которую идут только COMMIT'ы "). Но из того объяснения я так и не понял, почему эта ошибку так трудно было воспроизвести. И почему вообще никто про неё ничего не говорил с 2000 %-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 18:38:05 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
причем тут личка, в трекере есть описание ошибки, там есть хоть слово про инсерты? Или думаешь я там специально туман напускаю, чтобы никто не догадался? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 18:40:54 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
dimitrв трекере есть описание ошибки, там есть хоть слово про инсерты? http://tracker.firebirdsql.org/browse/CORE-4265 Under high concurrent load isc_attach_database() may return isc_lock_conflict error: Statement failed, SQLSTATE = 40001 lock conflict on no wait transaction without any obvious reasons . This happens only when a number of connections are being established at the same time .1) without any obvious reasons - они и сейчас, после фикса, не очевидные ? 2) are being established at the same time - я перевожу как: "устанавливаются в ОДНО И ТО ЖЕ время". Но в том тесте все новые коннекты шли с задержкой, там вызов паузы был между каждым N-м и (N+1)-м окном. И сообщение "lock conflict error" вылезало далеко не сразу после начала теста. И я в итоге так и не понимаю до сих пор: оно вообще с чем было связано-то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 18:59:54 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Таблоидони и сейчас, после фикса, не очевидные ? это описание с т.з. наблюдателя. Причины есс-но стали понятны при исправлении. Таблоидя перевожу как: "устанавливаются в ОДНО И ТО ЖЕ время". Но в том тесте все новые коннекты шли с задержкой, там вызов паузы был между каждым N-м и (N+1)-м окном. И сообщение "lock conflict error" вылезало далеко не сразу после начала теста. это не означает, что через N минут работы два окна не могли пытаться приконнектиться в ОДНО И ТО ЖЕ время. Что и приводило к ошибке, если они выполняли один и тот же код (весьма короткий, а потому неуловимый) одновременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 19:36:07 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
dimitrЧто и приводило к ошибке, если они выполняли один и тот же код (весьма короткий, а потому неуловимый) одновременно.Теперь понятно. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 19:40:56 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
PS. да, в той версии действительно были частые переконнекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2013, 19:41:38 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, я так понимаю, Оракл при update conflict и wait, в отличие от IB/FB, тупо переписывает изменения, на которые он "натолкнулся"? И это радует Павла Ишенина? Я удивлен. Зачем тогда wait? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 00:33:18 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
kdvя так понимаю, Оракл при update conflict и wait, в отличие от IB/FB, тупо переписывает изменения, на которые он "натолкнулся"? И это радует Павла Ишенина? Я удивлен. Зачем тогда wait? Это чуть-чуть иначе. Во-первых, у Оракула принципиально нет no wait. Во-вторых, он при конфликте не "переписывает изменения", а откатывает запрос и повторяет его целиком. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 00:42:09 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, ну и нафиг нам такой Оракл тут нужен... Перезапись чужих изменений без понимания, что это за изменения - зло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 03:04:29 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
kdvDimitry Sibiryakov, ну и нафиг нам такой Оракл тут нужен... Перезапись чужих изменений без понимания, что это за изменения - зло. А если с пониманием, что это повторный ajax request догнал первый и они оба прилетели на сервер одновременно? В текущей логике приложения других подобных ситуаций быть не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 03:32:42 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Павел Ишенин, если конфликты в принципе допустимы, но хочется уменьшить их число в таких ситуациях - рассмотри вариант с режимом изоляции read_committed no_record_version ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 07:31:49 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
kdvDimitry Sibiryakov, я так понимаю, Оракл при update conflict и wait, в отличие от IB/FB, тупо переписывает изменения, на которые он "натолкнулся"? И это радует Павла Ишенина? Я удивлен. Зачем тогда wait? А если commit первой транзакции произошёл одну наносекунду назад, то уже всё ok? Мы (вторая транзакция) должны радоваться что не случилось конфликта? :) А если мы (вторая транзакция) наступаем на update conflict за одну наносекунду до коммита первой, то мы вполне можем подождать эту наносекунду (пока первая закоммитится), перепроверить условие в where, и совершить апдейт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 09:28:49 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
NickDeeА если commit первой транзакции произошёл одну наносекунду назад, то уже всё ok? Мы (вторая транзакция) должны радоваться что не случилось конфликта? :) представь себе, да. Потому что наносекунда назад, или год назад, совершенно без разницы. NickDeeА если мы (вторая транзакция) наступаем на update conflict за одну наносекунду до коммита первой, то мы вполне можем подождать эту наносекунду (пока первая закоммитится), перепроверить условие в where, и совершить апдейт. в момент апдейта произошел конфликт. Если эта транзакция read_committed, то в ней программист может перечитать данные и повторить update. Но за него никто повторять апдейт не будет. Если сервер будет повторять выполняемые программой операции, то это будет не сервер, а прямо искуственный интеллект. А если это транзакция snapshot, то хоть обповторяйся, обновить запись будет невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:07:32 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Павел ИшенинА если с пониманием, что это повторный ajax request догнал первый и они оба прилетели на сервер одновременно? ну так программа должна это понимать, и обрабатывать. А не висеть на lock wait а потом в ужасе сообщать, что произошел конфликт. Я понимаю, что хотелось обойтись без написания кода, но увы, не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:09:15 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
dimitrПавел Ишенин, если конфликты в принципе допустимы, но хочется уменьшить их число в таких ситуациях - рассмотри вариант с режимом изоляции read_committed no_record_version Спасибо. Вкупе со следующим документом все стало понятнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 10:59:40 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Павел Ишенин, в той статье не совсем верно сделаны выводы, этот режим не гарантирует сериализацию при более чем двух конкурентах. Просто вероятность конфликта меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:26:24 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
kdvну так программа должна это понимать, и обрабатывать. А не висеть на lock wait а потом в ужасе сообщать, что произошел конфликт. Дима, рекомендации по написанию приложения, это offtopic. Но раз уж хочется, то: 1. lock wait используется только для отдельных запросов, которые наперед известно что могут прийти одновременно и с точки зрения приложения это нормально. 2. повисеть 10 секунд это тоже нормально, так как запрос асинхронный и в интерфейсе пользователь этого вообще не заметит никак. 3. ошибки этого запроса не сказываются на работоспособности приложения и не выводятся в интерфейсе пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:26:34 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Павел ИшенинДима, рекомендации по написанию приложения, это offtopic. Но раз уж хочется, то: Павел, при wait конфликта не будет только если конкурирующая транзакция завершилась по rollback. Об этом, если уж хочется, можно прочитать в документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:37:52 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
[quot kdv]Павел ИшенинПавел, при wait конфликта не будет только если конкурирующая транзакция завершилась по rollback. Об этом, если уж хочется, можно прочитать в документации. Тем не менее, вариант Дмитрия Еманова на тестах в isql практически исключил появление указанной ошибки. Вторая конкурирующая транзакция стала ждать и завершаться без ошибок. Я полагаю, что все равно возможны ситуации с ошибкой, но их вероятность стала значительно ниже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 11:48:58 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
Павел ИшенинТем не менее, вариант Дмитрия Еманова на тестах в isql практически исключил появление указанной ошибки. лишь бы софт не переписывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 12:06:35 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
kdvNickDeeА если мы (вторая транзакция) наступаем на update conflict за одну наносекунду до коммита первой, то мы вполне можем подождать эту наносекунду (пока первая закоммитится), перепроверить условие в where, и совершить апдейт. в момент апдейта произошел конфликт. Если эта транзакция read_committed, то в ней программист может перечитать данные и повторить update. Типа вот такого?: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Так работает. Только почему-то не получилось отловить по sqlcode -904 и по gdscode = 335544451, что соответствует ошибке показанной в IBExpert: "Update conflicts with concurrent update". Я тут с обработкой ошибок отметил несколько неудобств и рудиментов. Если бы я писал много кода на хранимках с обработкой ошибок, то очень быстро захотел бы обработки как в Delphi (для удобства и скорости). Работать с ошибками по номерам сильно удручает. И удручает что нет наследования. Наследования хотелось бы как для пользовательских эксепшэнов, так и для системных. Почему бы нам в sql не хотеть себе таки же удобно, как в Delphi? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 12:23:15 |
|
||
|
deadlock при update записи
|
|||
|---|---|---|---|
|
#18+
NickDeeРаботать с ошибками по номерам сильно удручает. И не надо: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2013, 20:55:21 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38481347&tid=1564104]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
187ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 456ms |

| 0 / 0 |
