2010-04-14 17 views
8

Szybko przejrzałem podręcznik MySQL, ale nie znalazłem dokładnych informacji na temat mojego pytania. Oto moje pytanie: jeśli mam tabelę A InnoDB z dwoma wyzwalaczami wyzwalanymi przez "AFTER INSERT ON A" i "PO AKTUALIZACJI NA A". Dokładniej, na przykład: jeden wyzwalacz jest zdefiniowany jako:Transakcja i wyzwalacz MySQL

CREATE TRIGGER test_trigger AFTER INSERT ON A 
     FOR EACH ROW 
         BEGIN 
         INSERT INTO B SELECT * FROM A WHERE A.col1 = NEW.col1 
         END; 

można ignorować zapytania między BEGIN I END, w zasadzie mam na myśli ten wyzwalacz będzie wstawić kilka wierszy do tabeli B, który jest również tabela InnoDB.

Teraz, gdy rozpocząłem transakcję, a następnie wstawię wiele wierszy, powiedzmy: 10K wierszy, do tabeli A. Jeśli nie ma wyzwalacza powiązanego z tabelą A, wszystkie te wstawki są atomowe, to na pewno. Teraz, jeśli tabela A jest powiązana z kilkoma wyzwalaczami wstawiania/aktualizacji, które wstawiają/aktualizują wiele wierszy do tabeli B i/lub tabeli C itd., Czy wszystkie te wstawienia i/lub aktualizacje będą cały czas atomowe?

Myślę, że nadal jest atomowa, ale jest trudna do przetestowania i nie mogę znaleźć żadnych wyjaśnień w Podręczniku. Ktoś może to potwierdzić?

+0

Tak, na pewno W DB/2 ... –

+0

można wskazać, gdzie wspomniano w instrukcji? – WilliamLou

+0

Możliwy duplikat [Are triggers transaction?] (Http://stackoverflow.com/questions/37749288/are-triggers-transaction) – Sandeep

Odpowiedz

5

I przez atomowy, to znaczy, jeśli jeden rachunek w spuście zawiedzie, cała wypowiedź kończy się niepowodzeniem. Tak - wyzwalacz jest wykonywany w kontekście transakcji wyciągu. I nie, oczywiście, jeśli nie ma transakcji, nie ma kontekstu transakcji.

W przypadku tabel transakcyjnych niepowodzenie wyciągu powinno spowodować wycofanie wszystkich zmian dokonanych przez wyciąg. Niepowodzenie wyzwalacza powoduje niepowodzenie instrukcji, więc niepowodzenie wywołania również powoduje wycofanie. W przypadku tabel nietransakcyjnych takie wycofanie nie może być wykonane, więc mimo tego, że instrukcja się nie powiedzie, wszelkie zmiany wykonane przed punktem błędu pozostają w mocy.

I nie można rozpocząć transakcji w wyzwalaczu.

+0

Dzięki za napiwek, że nie można rozpocząć/zakończyć transakcji w wyzwalaczu. +1 –

Powiązane problemy