ActiveRecord::Base.transactionのコードを読む
公開日:
:
Ruby on Rails
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
実装の大体の予想はつくものの、確認しておきたいので読んでみた。
% gvim /opt/local/lib/ruby//gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb
def transaction(&block)
previous_handler = trap('TERM') { raise TransactionError, "Transaction aborted" }
increment_open_transactions
begin
connection.transaction(Thread.current['start_db_transaction'], &block)
ensure
decrement_open_transactions
trap('TERM', previous_handler)
end
end
% gvim /opt/local/lib/ruby//gems/1.8/gems/activerecord-2.0.2//lib/active_record/connection_adapters/abstract/database_statements.rb
# Wrap a block in a transaction. Returns result of block.
def transaction(start_db_transaction = true)
transaction_open = false
begin
if block_given?
if start_db_transaction
begin_db_transaction
transaction_open = true
end
yield
end
rescue Exception => database_transaction_rollback
if transaction_open
transaction_open = false
rollback_db_transaction
end
raise unless database_transaction_rollback.is_a? ActiveRecord::Rollback
end
ensure
if transaction_open
begin
commit_db_transaction
rescue Exception => database_transaction_rollback
rollback_db_transaction
raise
end
end
end
やはりほぼ予想通りの実装だった。
関連記事
- PREV
- iSightからのビデオ入力をウィンドウにリアルタイムで表示する
- NEXT
- rb_obj_id