RubyonRails事物嵌套具体方法应用解析

要向熟练地掌握Ruby on Rails具体用法,为我们的编程带来方便。首先就要从其内置的一些功能特点看起。比如Ruby on Rails事物嵌套等。#t#

成都创新互联公司是一家集网站建设,枝江企业网站建设,枝江品牌网站建设,网站定制,枝江网站建设报价,网络营销,网络优化,枝江网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

首先看 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支持事务嵌套也就有点勉强!

网页名称:RubyonRails事物嵌套具体方法应用解析
网页路径:http://www.mswzjz.com/qtweb/news10/172810.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联