Niedawno otworzyłem portal, który w bardzo szybkim tempie rozpoczął sie rozwijać. I wraz z ubiegiem czasu pojawiły sie problemy.
Po długich analizach zachowań doszedłem do wniosku, że problem pojawia się w transakcjach. Przedstawie prosty przykład:
Jeśli użytkownik posiada punkty to ma mu jeden odjąć i coś wykonać.
<?php 2.) $query = wykonaj_sql("SELECT `ilosc_punktow` from `uzytkownicy` WHERE login = '".$login."' LIMIT 1 LOCK IN SHARE MODE"); 4.) if ($punkty == 0) { wykonaj_sql("UPDATE `uzytkownicy` SET `ilosc_punktow` = `ilosc_punktow` - 1 WHERE login = '".$login."'"); ...Jakieś zapytanie.... } ?>
W niektórych momentach dochodzi do sytuacji, w której dane elementy blokują sie, a mianowicie gdy chce wykonać zapytanie dotyczace tabeli `uzytkownicy`:
SELECT * FROM `uzytkownicy` WHERE `login` = '$login'
Otrzmuje blad:
#1205 - Lock wait timeout exceeded; try restarting transaction
Moje wnioski:
Po wykonaniu LOCK IN SHARE nastepuje np. zerwanie polaczenia przez co skrypt w danym polaczeniu nie moze wykonać "COMMIT;" odblokowywujac w ten sposób blokade na element.
Jakieś propozycje?
Z góry dziękuję i pozdrawiam