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
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!