Mam tabelę MySQL implementującą kolejkę pocztową i używam jej również do wysyłania maili, które zgłaszają nieoczekiwane błędy w systemie. Czasami te niewyjątkowe błędy występują wewnątrz transakcji, więc kiedy wycofuję transakcję, cofam również wstawiony wiersz (pocztę, która zgłasza nieoczekiwany błąd) w tabeli kolejki poczty.

Moje pytanie brzmi, jak mogę wymusić wstawienie wiersza w tabeli w środku transakcji, ignorując możliwe wycofanie transakcji?. Mam na myśli, że jeśli transakcje w końcu się cofną, nie należy wycofywać również wstawiania wiersza dla e-maila zgłaszającego szczegóły błędu.

Ta tabela może być odczytywana przez wiele asynchronicznych procesów w celu wysłania wiadomości e-mail w kolejce, więc w tym scenariuszu wiersze muszą być blokowane, aby wysłać tylko raz wiadomości e-mail, więc nie jest możliwe użycie typu tabeli MyISAM i używa się Innodb.

Z góry dziękuję.

1
user1023768 14 luty 2012, 15:55

2 odpowiedzi

Najlepsza odpowiedź

Jeśli INSERT powinieneś przetrwać ROLLBACK transakcji, możesz śmiało powiedzieć, że nie jest ona częścią transakcji. Więc co powinieneś zrobić, to po prostu przenieść go poza transakcję. Można to osiągnąć na wiele sposobów:

  • Podczas transakcji, zamiast uruchamiać Cię INSERT, przechowuj pola w zmiennych sesji (te przetrwają ROLLBACK), po transakcja uruchamia wstawkę ze zmiennych sesji
  • Przemyśl swój schemat na nowo – to cuchnie jakimś głębszym problemem
  • Otwórz drugie połączenie z bazą danych i uruchom swoje INSERT na tym, nie będzie to miało wpływu na transakcję na pierwszym połączeniu.
2
Eugen Rieck 14 luty 2012, 16:03

Możesz utworzyć inne połączenie z bazą danych, aby wstawić błędy i nie będzie to w tym samym kontekście transakcji, więc zostaną wstawione.

0
Stelian Matei 14 luty 2012, 16:02