|
|
|
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, 12:38:10 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Oleg8000, Дай определение таблицы balances. В частности, интересно какие там индексы и какой движок используется. (storage engine). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:16:45 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Oleg8000 Код: sql 1. Решение напрашивается само собой - сразу создавать для нового пользователя запись с нулевым балансом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:18:02 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:37:35 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
tanglirРешение напрашивается само собой - сразу создавать для нового пользователя запись с нулевым балансом. Не хотелось бы... юзеров будет очень много, поэтому решили вынести баланс в отдельную таблицу, чтобы работа с балансом была максимально быстрой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:40:11 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Oleg8000MasterZiv, Код: sql 1. 2. 3. 4. 5. Так просто ? Два поля ? Не верю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:41:32 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Oleg8000tanglirРешение напрашивается само собой - сразу создавать для нового пользователя запись с нулевым балансом. Не хотелось бы... юзеров будет очень много, поэтому решили вынести баланс в отдельную таблицу, чтобы работа с балансом была максимально быстрой Это дурость. Не в смысле вынесения, а в смысле надежды, что станет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:42:24 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
MasterZivТак просто ? Два поля ? Не верю...Вытащили 2 поля из основной таблицы юзеров в отдельную. Видимо, во многих полях в исходной таблице был нулл/0, и надеялись, что за счёт отсутствия их в новой таблице работа ускорится. Но MasterZivЭто дурость. Не в смысле вынесения, а в смысле надежды, что станет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:45:07 |
|
||
|
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:48:56 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, ну это просто для того чтоб легче примеры читались. ситуация воспроизводится при такой структуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:50:49 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
tanglirсразу создавать для нового пользователя запись с нулевым балансом.+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:51:29 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Давайте рассмотрим эту проблему не с точки зрения архитектуры, а с точки зрения решения самой проблемы. Структура таблицы есть. Воспроизвести проблему на локале - дело 1 минуты, достаточно открыть 2 терминала. Deadlock есть. Как от него избавится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:55:31 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Ну или ужесточите уровень изоляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 13:58:20 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Akina, вот кстати копаю в этом направлении )) только не ужесточить, а наоборот понизить помогло. Код: sql 1. тогда такой запрос работает как надо. Код: sql 1. но это еще только первые вести с полей... возможно будут побочные эффекты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 14:05:53 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
А был какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 14:51:50 |
|
||
|
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:10:51 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
AkinaНу или ужесточите уровень изоляции. Куда уж жёсче ... Некуда ужесточать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:11:25 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
Можно попробовать не делать SELECT... FOR UPDATE вообще, делать UPDATE, что-то про UPDATE-илось -- ок, хорошо, нет -- вставлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:13:06 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
AkinaА был какой? был по дефолту REPEATABLE-READ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:17:13 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
MasterZivпопробуй только одну сессию пустить ... по отдельности отрабатывают нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:18:39 |
|
||
|
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:25:48 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
insert on duplicate key update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:26:16 |
|
||
|
Deadlock при добавлении строки
|
|||
|---|---|---|---|
|
#18+
ScareCrowinsert 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+
MasterZivСтранно, такого вроде бы быть не должно... А точно между ними дедлок ?я ради интереса на пустой таблице (создал по ddl ТСа) попробовал - воспроизводится на пустой! таблице что оно там ухитряется залочить?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:40:19 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38512218&tid=1835481]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
25ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 334ms |

| 0 / 0 |
