阿Q的博客

如果您发现任何问题,欢迎指正!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
源代码分析

首先看 transaction 方法

ActiveRecord::Transactions Public Class methods
     # File vendor
/rails/activerecord/lib/active_record/transactions.rb, line 187
187:     def transaction(&block)
188:       self.class.transaction(&block)
189:     end

 可以看出他是调用类方法,类方法代码如下:

       # 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

 

 上面的代码即实现了rails中的transaction,可见ActiveRecord是不支持事务嵌套的。 如果模型使用的是相同的数据库, 那么用 ModelA.transaction 或 ModelB.transaction的作用是一样的。


Code

  都是一样的!

  这些对象的方面或类方面, 到最后都是转换成SQL,让数据库来执行, 如果明白这个,一切都变得简单了! 

就从SQL而言 "model.transaction do" 只是执行 Begin, "end" 执行Commit. 对于MYSQL个别是引挚支持的存储点功能不在本文讨论范围之内。补充一下, 目前只是SQLServer支持事务嵌套,所以如果说ROR支持事务嵌套也就有点勉强!

 

posted on 2009-07-14 09:29  坏份子  阅读(995)  评论(0编辑  收藏  举报