Ruby on Rails事物嵌套具體方法應(yīng)用解析
要向熟練地掌握Ruby on Rails具體用法,為我們的編程帶來方便。首先就要從其內(nèi)置的一些功能特點看起。比如Ruby on Rails事物嵌套等。#t#
首先看 transaction 方法
- ActiveRecord::Transactions 
Public Class methods - # File vendor/rails/acti
verecord/lib/active_record/
transactions.rb, line 187 - 187: def transaction(&block)
 - 188: self.class.transaction(&block)
 - 189: end
 
可以看出他是調(diào)用類方法,類方法代碼如下:
- # File vendor/rails/activerecord/lib/
 
active_record/transactions.rb, line 75- def transaction(&block)
 - increment_open_transactions
 - begin
 - #connection is kind of MysqlAdapter
 - connection.transaction(Thread.current
 
['start_db_transaction'], &block)- ensure
 - decrement_open_transactions
 - end
 - end
 - #connection.transaction call method in
 - # File vendor/rails/activerecord/
 
lib/active_record/connection_
adapters/abstract/database_
statements.rb, line 58- # 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
 
上面的代碼即實現(xiàn)了rails中的transaction,可見ActiveRecord是不支持Ruby on Rails事物嵌套的。 如果模型使用的是相同的數(shù)據(jù)庫, 那么用 ModelA.transaction 或 ModelB.transaction的作用是一樣的。
- Code
 - objecta.transaction do
 - objectb.save!
 - end
 
或者
- objectb.transaction do
 - objecta.save!
 - end
 
或者
- ModelA.transaction do
 - objectb.save!
 - end
 
都是一樣的!
這些對象的方面或類方面, 到***都是轉(zhuǎn)換成SQL,讓數(shù)據(jù)庫來執(zhí)行, 如果明白這個,一切都變得簡單了!
就從SQL而言 "model.transaction do" 只是執(zhí)行 Begin, "end" 執(zhí)行Commit. 對于MYSQL個別是引摯支持的存儲點功能不在本文討論范圍之內(nèi)。補充一下, 目前只是SQLServer支持Ruby on Rails事物嵌套,所以如果說ROR支持事務(wù)嵌套也就有點勉強!















 
 
 
 
 
 
 