Tranzakcje dla kilku tabel

W jednej akcji mam zapisane operacje na kilku modelach, wypadałoby żeby było w transakcji, dla bezpieczeństwa.

Ale zapisanie czegoś takiego chyba nie jest najlepsze:

a.transaction do b.tarnsaction do c.transaction do d.tarnsaction do e.transaction do ... end end end end end

Z tego co wiem (a na razie mało wiem, ale ostatnio o tym czytałem gdzieś), wszystkie operacje na AR w bloku transakcji są transakcyjne, nie ważne na którym jest odpalona transakcja.
EDIT:
to chyba to http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

ale w zacytowanym przez ciebie linku widać, że jest podobny fragment kodu do mojego. Nagłówek jest zatytułowany “Transactions are not distributed across database connections”

Ale to w przypadku jeśli masz osobne bazy/schematy itp dla każdej klasy. Jeśli wszystko trzymasz w jednym worku i transakcja działą na jednym połączeniu do jednej bazy to poniższe powinno śmigać

Account.transaction do balance.save! account.save! end
Przynajmniej tak to rozumiem

czyli account i balance to modele w tej samej bazie i wtedy transakcja obejmuje te dwa modele, dobrze zrozumiałem ?

Co daje ten wykrzyknik po save, bo ja używam save ale bez wykrzyknika

.save zwraca true/false
.save! rzuca wyjątkiem

a nie lepiej najpierw przeprowadzić .validate?

pytam się bo nie wiem co jest lepsze

A) transakcje obejmują wszystkie tabele w bazie danych lub schemacie (postgresql, zdaje się też Oracle) więc przy
ActiveRecord::Base.transaction do
record_a.save!
record_b.save!
end
bład record_b.save! zrollbackuje także zapis record_a

b) validate? nie rollabackuje zmian. save i save! rollbackują zmiany jeżeli będzie błąd. różnią się tylko zachowaniem w Rails. definicja save! jest ± następująca
def save!
save || raise(ActiveRecord::Error)
end

Uwaga, transakcję zrollbackować może również zły update albo select ! jeżeli zostanie źle sformatowane zapytanie. Oraz raise ActiveRecord::Rollback

PS. validate? nie złapie błędów gdy na przykład są na bazie danych założone constrainty, co jednak spowoduje rollbacka albo exception na save!