|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
ScareCrowавторто что было наинсерчено батчем 5846 убрал роллбэк убитой дедлоком транзакции. а что это значит? забей. меня интересуют пояснения от того кто в курсе что такое дедлок и что он делает с транзакциями. 2All вопрос все тот же, с чего вдруг 2 делита на разные наборы строк решили поставить record lock на одну и ту же запись ? почему это провоцирует дедлок, а не обычное ожидание ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2019, 12:07 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
поставил mysql локально 5.6.39, не работают даже совсем примитивные транзакции. таблица Код: sql 1. 2. 3. 4. 5.
транзакция 1 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
транзакция 2 Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
теперь в транзакции 1 удаляем ту самую строку какую вставила эта транзакция Код: sql 1.
транзакция 1 уже повисает на блокировке теперь в транзакции 2 удаляем ее строку Код: sql 1. 2.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
в mysql 8 чуток реже, но в принципе примерно ту же хрень получаю. как же так !? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2019, 22:17 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
авторкак же так тут как раз всё просто. без уникального индекса по полю во where надо просмотреть всю таблицу. транзакция 1 уже держит лок на shit1, транзакция 2 на shit2 и они пытаются получить лок друг на друга. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 12:12 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
ScareCrowавторкак же так тут как раз всё просто. без уникального индекса по полю во where надо просмотреть всю таблицу. транзакция 1 уже держит лок на shit1, транзакция 2 на shit2 и они пытаются получить лок друг на друга. не понимаю. во первых откуда транзакция1 знает о shit2 строке? транзакция2 не закомиченна, выходит что транзакция1 читает грязные данные. во вторых зачем ставить локи на не входящие в предикат строки ? у транзакции1 предикат name='shit1', даже если она фулсканит таблицу, зачем ставить лок на все подрят ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 12:32 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
авторо первых откуда транзакция1 знает о shit2 строке? транзакция2 не закомиченна, выходит что транзакция1 читает грязные данные. чтобы понять что строка не видна текущей транзакции, логично, что надо её прочитать. автордаже если она фулсканит таблицу, зачем ставить лок на все подрят ? у нас же row locking, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 13:07 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
ScareCrowавторо первых откуда транзакция1 знает о shit2 строке? транзакция2 не закомиченна, выходит что транзакция1 читает грязные данные. чтобы понять что строка не видна текущей транзакции, логично, что надо её прочитать. и это объявляется транзакцией? ну да, на одной странице данных есть строки которые транзакция "видит", есть которые не видит. mysql обязан игнорить незакомиченные данные иначе это уже не транзакция. иначе это откровенное нарушение изоляции транзакций. ScareCrowавтордаже если она фулсканит таблицу, зачем ставить лок на все подрят ? у нас же row locking, да. row locking это когда субд блокирует ровно те записи, что необходимо. тут же mysql вместо конкретных записей пытается заблокировать целиком всю таблицу. это уже противоположность row level locks и называется lock escalation. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:02 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
авторmysql обязан игнорить незакомиченные данные как он поймет что это незакоммиченные до того как их прочитает? автортут же mysql вместо конкретных записей пытается заблокировать целиком всю таблицу это не так от слова совсем. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:07 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
ScareCrowавторmysql обязан игнорить незакомиченные данные как он поймет что это незакоммиченные до того как их прочитает? так как делают взрослые субд. на страницу данных ставится латч, страница считывается, если таймстемп записи выше чем таймстемп транзакции то запись для этой тразакции "невидима". локи ставить на такую запись табу. если запись "видима", вот тогда в таблицу блокировок ставиться лок. тут важно что сначала читается страница, потом уже лок выставляется. и не на все подряд, а только на то что реально нужно залочить. ScareCrowавтортут же mysql вместо конкретных записей пытается заблокировать целиком всю таблицу это не так от слова совсем. это так. не стоит спорить. если блокируется больше, чем необходимо это не row level locking. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:22 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
авторна страницу данных ставится латч а если там УЖЕ латч? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:34 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
автор вот тогда в таблицу блокировок ставиться лок а если нет таблицы блокировок? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:35 |
|
Deadlock на insret нескольких строк из-за autoincrement
|
|||
---|---|---|---|
#18+
ScareCrowавторна страницу данных ставится латч а если там УЖЕ латч? значит читать страницу не безопасно и нужно ждать когда конкурирующий процесс, например записи страницы на диск, отпустит страницу. ScareCrowавтор вот тогда в таблицу блокировок ставиться лок а если нет таблицы блокировок? тогда это оракл, который хранит блокировки на странице данных и "версионность" накладывает не на отдельные строки, а целиком страницу. но это на сколько я знаю не про innodb. innodb хранит в памяти список (таблицу) блокировок. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 15:02 |
|
|
start [/forum/topic.php?fid=47&msg=39816481&tid=1829138]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 310ms |
total: | 465ms |
0 / 0 |