
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
25.12.2013, 12:38:10
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
Здравствуйте. Есть такая задача: пополнение баланса пользователя. По запросу на пополнение баланса выполняется простой алгоритм: Ищем в таблице балансов запись, которая принадлежит пользователю. Если у пользователя есть баланс, то такая запись присутствует, если баланса нет - записи тоже нет. Если приходит одновременно несколько запросов на пополнение баланса одному юзеру, у которого нет записи (нулевой баланс), то случается deadlock. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. id - не является автоинкрементом, на самом деле это USER_ID Пробовал INSERT ... ON ON DUPLICATE KEY UPDATE - также не решает проблемы. Как решить проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:16:45
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Oleg8000, Дай определение таблицы balances. В частности, интересно какие там индексы и какой движок используется. (storage engine). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:18:02
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Oleg8000 Код: sql 1. Решение напрашивается само собой - сразу создавать для нового пользователя запись с нулевым балансом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:37:35
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
MasterZiv, Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:40:11
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
tanglirРешение напрашивается само собой - сразу создавать для нового пользователя запись с нулевым балансом. Не хотелось бы... юзеров будет очень много, поэтому решили вынести баланс в отдельную таблицу, чтобы работа с балансом была максимально быстрой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:41:32
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Oleg8000MasterZiv, Код: sql 1. 2. 3. 4. 5. Так просто ? Два поля ? Не верю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:42:24
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Oleg8000tanglirРешение напрашивается само собой - сразу создавать для нового пользователя запись с нулевым балансом. Не хотелось бы... юзеров будет очень много, поэтому решили вынести баланс в отдельную таблицу, чтобы работа с балансом была максимально быстрой Это дурость. Не в смысле вынесения, а в смысле надежды, что станет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:45:07
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
MasterZivТак просто ? Два поля ? Не верю...Вытащили 2 поля из основной таблицы юзеров в отдельную. Видимо, во многих полях в исходной таблице был нулл/0, и надеялись, что за счёт отсутствия их в новой таблице работа ускорится. Но MasterZivЭто дурость. Не в смысле вынесения, а в смысле надежды, что станет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:48:56
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
тут еще интереснее стало... даже если приходят запрос на пополнение баланса от разных юзеров. все равно вываливается deadlock Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Мне кажется, это связано с блокировкой следующего ключа, но пока я плаваю в этой теме... В эту сторону копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:50:49
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
MasterZiv, ну это просто для того чтоб легче примеры читались. ситуация воспроизводится при такой структуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:51:29
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
tanglirсразу создавать для нового пользователя запись с нулевым балансом.+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:55:31
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
Давайте рассмотрим эту проблему не с точки зрения архитектуры, а с точки зрения решения самой проблемы. Структура таблицы есть. Воспроизвести проблему на локале - дело 1 минуты, достаточно открыть 2 терминала. Deadlock есть. Как от него избавится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 13:58:20
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Ну или ужесточите уровень изоляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 14:05:53
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
Akina, вот кстати копаю в этом направлении )) только не ужесточить, а наоборот понизить помогло. Код: sql 1. тогда такой запрос работает как надо. Код: sql 1. но это еще только первые вести с полей... возможно будут побочные эффекты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 14:51:50
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
А был какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:10:51
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Oleg8000тут еще интереснее стало... даже если приходят запрос на пополнение баланса от разных юзеров. все равно вываливается deadlock Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Мне кажется, это связано с блокировкой следующего ключа, но пока я плаваю в этой теме... В эту сторону копать? Странно, такого вроде бы быть не должно... А точно между ними дедлок ? попробуй только одну сессию пустить ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:11:25
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
AkinaНу или ужесточите уровень изоляции. Куда уж жёсче ... Некуда ужесточать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:13:06
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
Можно попробовать не делать SELECT... FOR UPDATE вообще, делать UPDATE, что-то про UPDATE-илось -- ок, хорошо, нет -- вставлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:17:13
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
AkinaА был какой? был по дефолту REPEATABLE-READ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:18:39
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
MasterZivпопробуй только одну сессию пустить ... по отдельности отрабатывают нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:25:48
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
MasterZivМожно попробовать не делать SELECT... FOR UPDATE вообще, делать UPDATE, что-то про UPDATE-илось -- ок, хорошо, нет -- вставлять. Без FOR UPDATE нельзя. Это редкий случай - когда пришел запрос, а баланса у юзера нету. Чаще происходит ситуации, когда у юзера есть баланс. Если в начале транзакции будет просто SELECT ... WHERE id=1, а в конце UPDATE ... SET balance = balance+10 WHERE id=1 То при паралельных запросах один из них потеряется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:26:16
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
insert on duplicate key update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:28:25
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
ScareCrowinsert on duplicate key update а еще можно прочесть все сообщения в теме. уже обсуждалось.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:31:50
|
|||
|---|---|---|---|
|
|||
Deadlock при добавлении строки |
|||
|
#18+
ScareCrowinsert on duplicate key update На самом деле это пока наилучший вариант, но требуется понизить уровень изоляции. Это пока смущает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2013, 15:40:19
|
|||
|---|---|---|---|
Deadlock при добавлении строки |
|||
|
#18+
MasterZivСтранно, такого вроде бы быть не должно... А точно между ними дедлок ?я ради интереса на пустой таблице (создал по ddl ТСа) попробовал - воспроизводится на пустой! таблице что оно там ухитряется залочить?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&tablet=1&tid=1835481]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 360ms |

| 0 / 0 |
