Насколько я могу судить, вам больше не нужно звонить rollback()
для отката транзакции.Вам просто нужно заключить его в блок транзакции, например так:
YourModel.transaction do
@sql_statements.each do |sql_statement|
DataMapper.repository(:default).adapter.execute(sql_statement)
end
end
По крайней мере, так я прочитал спецификацию dm-транзакций об откатах :
it 'should rollback when an error is raised in a transaction' do
@user_model.all.size.should == 0
lambda {
@user_model.transaction do
@user_model.create(:name => 'carllerche')
raise 'I love coffee'
end
}.should raise_error('I love coffee')
@user_model.all.size.should == 0
end
Я писал значительное приложение, использующее DataMapper с большим количеством транзакций и без использования rollback()
, и все мои неудачные транзакции всегда откатывались.
Кроме того, из того, что я помню об ActiveRecord (Прошел год с тех пор, как я использовал AR), поведение транзакции DataMapper имитирует поведение AR.