Wpis z mikrobloga

Mam problem z #sql i #mysql:
Zaczynam transakcję
Robię LOCK TABLES na kilku tabelach
// działam: pobieram dane, jakieś updaty, inserty
UNLOCK TABLES;
koniec transakcji

1. czy muszę robić lock na wszystkich tabelach, z którymi działam wewnątrz? Kluczowa jest jedna tabela, gdzie sprawdzam czy jest nr zamówienia, jeśli nie to jest nadawany.
2. Celem jest zabezpieczenie jednoczesnego zamówienia "produktu".
3. Niestety o ile działa to chyba to przy symulowaniu jednoczesnego zamawiania mam MySQL server has gone away na jakiś czas. Potem wraca i faktycznie w drugim procesie jest ok. Ale dlaczego taki lock zabija bazę?

Uruchamiam na #docker
  • 7
@masterix: Przede wszystkim potrzebujesz logów z serwera, żeby wiedzieć czemu "gone away". Może mu brakło pamięci. LOCK TABLES nie jest dobrym pomysłem na zabezpieczenie transakcji, zwłaszcza na kilku, jeśli ich nie potrzebujesz - to proszenie się o deadlocki i timeouty.
Poczytaj o SELECT ... FOR UPDATE w transakcji. Może w zupełności wystarczyć na Twoje potrzeby.
@RRybak: jeśli nie lockowałem wszystkim to mi sypało błędami, a aż takim specem od tego nie jestem. Faktycznie jest tak, że musisz lockować wszystkie tabele, których używasz pomiędzy LOCK a UNLOCK?
@masterix: tworzę ogromne, na serio ogromne systemy ERP. Spływają tu zamówienia, wydania, magazyn, logistyka i w żadnym z nich nie występuje "LOCK TABLES" (no, może w funkcjach czysto serwisowych).
Ciężko mi stwierdzić co próbujesz zrobić z tymi "jakimiś błędami", ale podejrzewam, że idziesz nie w tę stronę i się sam zabijasz przy "konkurencyjności" połączeń.
InnoDB, FOR UPDATE, transakcje - więcej Ci nie trzeba.
@RRybak: Ok, dzięki. Nie wiedziałem, że locki takie zabijające. Po prostu SELECT FOR UPDATE jest mi +/- znany, ale to legacy code, na jakiejś starej frameworkowej bibliotece do bazy i myślałem, że uda mi się nie dotykać tego.
Ale skoro mówisz, że nie tędy droga to dzięki za wskazówkę i działam z elementami, które wskazałeś.