Mysql Deadlock found when trying to get lock; try restarting transaction
У таблиці лежать лічильники «скільки було показів на добу країнами». Лічильники постійно оновлюються запитом:
Видалень із цієї таблиці не буває.
До певного часу все працює добре, але коли кількість апдейтів однієї і тієї ж рядки в секунду перевищує якесь граничне значення, запити відвалюються з помилкою:
Deadlock found when trying to get lock; try restarting transaction
ЧЯДНТ? Можливо варто якось задіяти PRIMARY індекс?
Server version: 5.1.65-log FreeBSD port: mysql-server-5.1.65
Проблема вирішена частково обробкою дідлок в додатку, що працює з БД (воно намагається повторити останній запит і продовжити роботу в транзакції), і найбільшою мірою - відмовою від UNIQUE KEY UK_country_date (country_id, date) на користь PRIMARY KEY (`country_id`, `date`).
Можу помилятися, але, гадаю, допоможе попереднє заповнення таблиці значенням count=0, а потім чистий update. За бажанням, чищення дня, що минув, від нульових записів.
PS: якщо country_id цекраїни, то навіщо там 32-бітний int? Ви з іншої планети?
Ні, зрозуміло що будь-якої миті. На пальцях приблизно так Починаємо роботу — табличка порожня на кожне збільшення лічильника вставляємо запис qty — 1 1 1 Дізнатися поточне значення лічильника — select sum(qty) from counterTable Вночі в одній транзакції fullQty = select sum(qty) delete from counterTable insert into counterTable values (fullQty)
наступного дня після збільшення лічильника отримуємо qty — 3 1 1
поточне значення лічильника так само - select sum (qty)
Тут виходить що хоч і трохи збільшуєтьсяодержання лічильника. йдуть блокування на вставку.