Ruby on Rails事物嵌套具体方法应用解析

龙浩然 2014-06-03

参考地址:http://www.verydemo.com/demo_c119_i6715.html

....................................................................

  • Ruby监控网络发送断开警告信息
  • 总结各种Ruby on Rails命令
  • 轻松掌握Ruby on Rails上传图片实现技巧
  • 几点常识让你知道Ruby优点
  • Ruby关闭IE进程采用直接关闭进程法

首先看 transaction 方法

  1. ActiveRecord::Transactions 
    Public Class methods  
  2. # File vendor/rails/acti
    verecord/lib/active_record/
    transactions.rb, line 187  
  3. 187: def transaction(&block)  
  4. 188: self.class.transaction(&block)  
  5. 189: end 

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

  1. # File vendor/rails/activerecord/lib/
    active_record/transactions.rb, line 75  
  2. def transaction(&block)  
  3. increment_open_transactions  
  4. begin  
  5. #connection is kind of MysqlAdapter  
  6. connection.transaction(Thread.current
    ['start_db_transaction'], &block)  
  7. ensure  
  8. decrement_open_transactions  
  9. end  
  10. end  
  11. #connection.transaction call method in  
  12. # File vendor/rails/activerecord/
    lib/active_record/connection_
    adapters/abstract/database_
    statements.rb, line 58  
  13. # Wrap a block in a transaction. 
    Returns result of block.  
  14. def transaction(start_db_transaction = true)  
  15. transaction_open = false 
  16. begin  
  17. if block_given?  
  18. if start_db_transaction  
  19. begin_db_transaction  
  20. transaction_open = true 
  21. end  
  22. yield  
  23. end  
  24. rescue Exception =>
     database_transaction_rollback  
  25. if transaction_open  
  26. transaction_open = false 
  27. rollback_db_transaction  
  28. end  
  29. raise unless database_transaction
    _rollback.is_a? ActiveRecord::Rollback  
  30. end  
  31. ensure  
  32. if transaction_open  
  33. begin  
  34. commit_db_transaction  
  35. rescue Exception => database
    _transaction_rollback  
  36. rollback_db_transaction  
  37. raise  
  38. end  
  39. end  
  40. end 

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

  1. Code  
  2. objecta.transaction do  
  3. objectb.save!  
  4. end 

或者

  1. objectb.transaction do  
  2. objecta.save!  
  3. end 

或者

  1. ModelA.transaction do  
  2. objectb.save!  
  3. end 

都是一样的!

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

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

【责任编辑:曹凯 TEL:(010)68476606】
原文:Ruby on Rails事物嵌套具体方法应用解析 返回开发首页

相关推荐

AllenYoung / 0评论 2014-07-04
jizhename / 0评论 2013-09-03