Na początku dodam, iż sprawa dotyczy sytuacji, gdy serwer jest bardzo obciążony i "muli".
Mam w bazie np. 1 przedmiot którego jest 10 sztuk. Użytkownik wchodzi na stronę, klika w button, wpisuje poprawnie captcha i jeżeli ilość sztuk jest większa od 0 to pobiera. Po tym, ilość jest pomniejszana o 1.
I tu mam problem. Gdy serwer baaardzo muli, a sztuk zostało np 1 dochodzi do takiej sytuacji:
W mniej więcej tym samym momencie captchę poprawnie wpisuje hmm, 20 userów. Wszyscy na raz wykonują zapytanie sprawdzające ilość sztuk. Po tym, jeżeli ilość > 0 wykonywane są operacje w php (mail, update 1 dodatkowej tabeli w bazie, zmiana w pliku) a na samym końcu po ich poprawnym wykonaniu ilość pomniejszana o 1. Lecz w mulącym serwerze zdarza się, że tych 20 userów dostanie wynik ilość > 0 gdyż np wykonanie żądania zajmuje 5sek. Trafiają akurat w "dziurę" pomiędzy wykonaniem SELECTa a końcowego UPDATEa i nagle z ilość pożądanej 0 robi mi się -19.
Jak temu zapobiec, aby np kolejkować zapytania w przypadku, gdy wykonywane jest żądanie? Transakcja chyba nie da nic bo i tak czy siak w tej dziurze może nastąpić sporo żądań. Czy jedynym rozwiązaniem jest przed SELECTem wykonanie LOCK TABLES ... WRITE, wykonanie zapytań + tych opisanych operacji i po zakończeniu ostatniej UNLOCK TABLES?
Z góry dzięki za odpowiedź i mam nadzieję, że problem opisałem wystarczająco.