Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Blokowanie transakcji w MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
d3m0n
Witam serdecznie
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ć.

  1. <?php
  2. 1.) mysql_query("START TRANSACTION;");
  3. 2.) $query = wykonaj_sql("SELECT `ilosc_punktow` from `uzytkownicy` WHERE login = '".$login."' LIMIT 1 LOCK IN SHARE MODE");
  4. 3.) $punkty = mysql_result($query,0,0);
  5. 4.) if ($punkty == 0) {  wykonaj_sql("UPDATE `uzytkownicy` SET `ilosc_punktow` = `ilosc_punktow` - 1 WHERE login = '".$login."'"); ...Jakieś zapytanie.... }
  6. 5.) mysql_query("COMMIT;");
  7. ?>


W niektórych momentach dochodzi do sytuacji, w której dane elementy blokują sie, a mianowicie gdy chce wykonać zapytanie dotyczace tabeli `uzytkownicy`:
  1. SELECT * FROM `uzytkownicy` WHERE `login` = '$login'


Otrzmuje blad:
  1. #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
rafalp
Odświeżam bo mam taki sam problem. Czy ktoś zna powód dla którego MySQL blokuje tabele po zerwanym połączeniu tak że pomaga tylko restart silnika? Wg mnie powinien być jakiś mechanizm który po błędzie zwalniał by tabele, wszak transakcja zadziałała - pierwsze zapytania nie wykonały się jednak dalej baza staje się nieużyteczna z powodu w/w błędu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.