Witajcie,

Prośba o pomoc w zrozumieniu tematu transakcji, do osób, które PERFEKCYJNIE znają temat. Mam napisane kawałki kodu, które działają, ale artykuły, które czytałem nie rozwiały wszystkich moich wątpliwości.

  1. Wykonuję zapytania w ramach transakcji (z wyłączonym AUTOCOMMIT, ponieważ cała transakcja to kilka odseparowanych zapytań wykonywanych przez PHP). Transakcja blokuje tabelę dopiero po wykonaniu zapytania, co jeśli dobrze ten mechanizm zrozumiałem nie zabezpiecza mnie w 100%. Wykonuję zapytanie na tabeli x (blokada tabeli x), potem dopiero na tabeli y (dopiero wówczas blokada tabeli y) i czysto teoretycznie między zapytaniami może dojść do katastrofy.

Rozumiem, że w tej sytuacji powinienem stosować LOCK TABLES zanim rozpocznę transakcję. Pytanie brzmi, czy po zakończeniu transakcji powinienem ręcznie odblokować tabele, czy też zakończenie transakcji samo je odblokuje (zakładając, że zapytania w ramach transakcji dotyczą tego samego zestawu tabel, które zablokowałem poprzez LOCK TABLES)?

  1. Co się stanie jeśli wyślę zapytanie LOCK TABLES lub rozpocznę transakcję, które zablokuje daną tabelę (pozwalając odczytywać innym dane), a następnie kod wywali błąd i nie dokończy działania (nie zdejmie blokady na tabeli)? Jak to działa na innych użytkowników?

  2. W jaki sposób założyć blokadę na konkretny wiersz tabeli i sprawić, by transakcja dotyczyłą tylko jego?

  3. Czy da się założyć blokadę np. na grupę wierszy (lock dla wierszy z danym user_id)?

  4. Jęśli dwóch userów wykonuje zapytania w transakcjach dotyczące tych samych zestawów danych, rozumiem, że ten drugi zaobserwuje po prostu dłuższy czas oczekiwania na odpowiedź od serwera MySQL (bo jego sesja czeka na zakończenie transakcji innego usera), czy tak?

  5. Powiedzmy, że w panelu admina aplikacji mamy moduł, który aktualizuje fakturę za pomocą transakcji. Faktury to dwie tabele (invoices oraz invoicesproducts). Tu wszystko działa jak należy, bo jeśli coś się podzieje, zmiany zostaną wycofane.

Powiedzmy, że w części klienckiej jest moduł z listą faktur użytkownika. Ten moduł wykonuje zapytanie SELECT nie korzystając z transakcji. Czy to zapytanie będzie widziało dane SPRZED zakończenia ewentualnej transakcji po stronie panelu admina, czy też może widzieć dane dodawane do tej tabeli?

W podanym przykładzie aktualizujemy najpierw tabelę invoices potem invoicesproducts. Stąd moje pytanie. Czy user BEZ TRANSAKCJI będzie widział niejako starą wersję faktury do momentu zakończenia transakcji w panelu admina?

  1. Pytanie dodatkowe niejako z poza powyższego tematu. Czy jest możliwość by MySQL wywalił błąd jeśli dla zapytania UPDATE nie istnieje żaden rekord?