Ruby on Rails事物嵌套也有不被支持的时候。在这篇文章中我们将会了解到Ruby on Rails事物嵌套是如何被编程人员应用的。

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

Ruby on Rails事物嵌套具体方法应用解析(ruby rails入门)  Rails事物嵌套 第1张

首先看 transaction 方法

  1. ActiveRecord::Transactions
    PublicClassmethods
  2. #Filevendor/rails/acti
    verecord/lib/active_record/
    transactions.rb,line187
  3. 187:deftransaction(&block)
  4. 188:self.class.transaction(&block)
  5. 189:end

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

  1. #Filevendor/rails/activerecord/lib/
    active_record/transactions.rb,line75
  2. deftransaction(&block)
  3. increment_open_transactions
  4. begin
  5. #connectioniskindofMysqlAdapter
  6. connection.transaction(Thread.current
    ['start_db_transaction'],&block)
  7. ensure
  8. decrement_open_transactions
  9. end
  10. end
  11. #connection.transactioncallmethodin
  12. #Filevendor/rails/activerecord/
    lib/active_record/connection_
    adapters/abstract/database_
    statements.rb,line58
  13. #Wrapablockinatransaction.
    Returnsresultofblock.
  14. deftransaction(start_db_transaction=true)
  15. transaction_open=false
  16. begin
  17. ifblock_given?
  18. ifstart_db_transaction
  19. begin_db_transaction
  20. transaction_open=true
  21. end
  22. yield
  23. end
  24. rescueException=>
    database_transaction_rollback
  25. iftransaction_open
  26. transaction_open=false
  27. rollback_db_transaction
  28. end
  29. raiseunlessdatabase_transaction
    _rollback.is_a?ActiveRecord::Rollback
  30. end
  31. ensure
  32. iftransaction_open
  33. begin
  34. commit_db_transaction
  35. rescueException=>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.transactiondo
  3. objectb.save!
  4. end

或者

  1. objectb.transactiondo
  2. objecta.save!
  3. end

或者

  1. ModelA.transactiondo
  2. objectb.save!
  3. end

都是一样的!

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

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

转载请说明出处
知优网 » Ruby on Rails事物嵌套具体方法应用解析(ruby on rails入门)

发表评论

您需要后才能发表评论