`
together
  • 浏览: 220398 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

对rails里transaction的嵌套处理方式不解

    博客分类:
  • ruby
阅读更多
本来要问的是下面这一段,自己看完文档明白了。
引用

#before do it:  a.name="a"
a = A.find(1)
a.name="b"
a.save

上面这段代码在普通的rb文件里,是可以正常更新数据的。
在test.rb里,每次执行完以后数据都没有更新,也就是说rollback事务了。

在test_helper.rb里是这样说的:
#Transactional fixtures accelerate your tests by wrapping each test method
  # in a transaction that's rolled back on completion.  This ensures that the
  # test database remains unchanged so your fixtures don't have to be reloaded
  # between every test method.  Fewer database queries means faster tests.

修改  self.use_transactional_fixtures = false 就可以更新数据了。


但还有另外一个问题,就是说我手工控制事务的回滚和提交该如何做呢?
现在是这样用事务:
ActiveRecord::Base.transaction do
  SELECTAA
  UPDATEAA
  SELECTBB
  UPDATEBB
rescue
ensure
end

我想实现的是,当查找到BB的时候,由于某种原因需要回滚整个事务。但是在上面的语句中,是只有在出现异常的时候才回滚的吧?如果在里面加上raise "xxxx",也可以实现回滚。但是除此之外,有没有可以手工控制的语句呢?
就像在TEST中,可以设置事务是否自动回滚一样。

后记:cookoo的回复
ActiveRecord::Base.connection.begin/commit/rollback_db_transaction

再测试一下事务嵌套效果:
ActiveRecord::Base.connection.begin_db_transaction
  ActiveRecord::Base.transaction do
  end
ActiveRecord::Base.connection.commit_db_transaction
执行结果是:begin begin commit commit

反过来:
ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.begin_db_transaction
  ActiveRecord::Base.connection.commit_db_transaction
end
执行结果是:begin begin commit commit

但是在_test.rb中加入
ActiveRecord::Base.transaction do
end
语句时,却仅执行外围的begin/commit/rollback,上面这条transaction do end中根本没有开启事务语句。相当于被外围接管了
分享到:
评论
2 楼 together 2006-12-30  
thanks!
继续学习,越来越感觉到RAILS的强大和巧妙了。除了语法上暂时有些不好适应。
1 楼 cookoo 2006-12-29  
你说的对,只能自己触发异常来回滚,因为AR的回滚是隐式的,不能显式控制。回滚完了异常会继续传播,可以立即rescue或者以后再处理。

transactional fixture里面用的是底层的ActiveRecord::Base.connection.rollback_db_transaction,如果你想绕过AR直接用connection adapter操作数据库的话。

相关推荐

    Ruby on Rails:Rails中的表单处理.docx

    Ruby on Rails:Rails中的表单处理.docx

    rails指南 中文版

    9. **ActiveJob**:Rails的后台任务处理框架,可以配合各种队列服务(如Resque、Sidekiq等)处理异步任务。 10. **Rails Console**:提供了一个交互式的命令行工具,用于检查和调试应用,执行Ruby代码,以及与...

    Rails101_by_rails4.0

    作者特别提到了“CRUD懶人大法Scaffold”,它是一种通过Rails自动生成代码的方式来快速搭建基本的CRUD操作,这大大简化了开发流程,使得开发者可以将更多的精力放在业务逻辑的实现上。 此外,书中还介绍了一些Rails...

    nestive, 一个更好的Rails 嵌套可以继承布局插件.zip

    nestive, 一个更好的Rails 嵌套可以继承布局插件 Nestive 用于 Rails的嵌套布局帮助器Nestive为你的Rails 应用程序添加强大的布局和视图助手。 它类似于嵌套布局技术,已经在 Rails 指南中记录,并且在许多其他嵌套...

    Advanced Rails

    "Advanced Rails" 涵盖了Rails开发中的高级主题和技术,是Ruby on Rails学习进阶的重要资源,尤其适合已经对基础Rails有一定了解的开发者。 在Web开发领域,Rails以其高效、简洁的代码和“约定优于配置”的哲学吸引...

    rails版本区别

    标题与描述概述的知识点主要集中在Rails 2与Rails 3之间的关键差异,这些差异涉及到脚本命令、配置文件以及路由的处理方式。以下是对这些知识点的详细解释与扩展: ### 脚本命令的变化 在Rails 2中,开发者通过一...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    Rails 3.2:嵌套形式的演示,第3部分:我们正在开始进攻!

    Rails 3.2引入了许多改进,其中包括对嵌套表单处理的优化,使得开发者能够更方便地构建复杂的Web应用。本篇文章将深入探讨“Rails 3.2:嵌套形式的演示,第3部分:我们正在开始进攻!”中的关键知识点。 1. **嵌套...

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    关于rails 3.1 cucumber-rails 1.2.0

    通过这种方式,Cucumber-Rails帮助团队确保代码按照预期运行,同时提供了一种非技术人员也能理解的测试文档。 在`support`目录下,开发者可以放置一些辅助文件,例如World类(用于扩展Cucumber的上下文)、Hooks...

    rails2-sample

    Rails插件是扩展框架功能的有效方式。本章节将介绍如何安装、使用和开发自己的Rails插件。插件可以提供新的特性或增强现有功能,帮助开发者更快地完成项目。 #### 11. Debugging, Testing, and Benchmarking(调试...

    Rails

    5. **路由**:Rails的路由系统将URL映射到控制器的行动上,提供了一种灵活的方式来定义和管理应用的路由结构。 描述中提到的博文链接指向了一个ITEYE博客文章,尽管具体内容未提供,但通常这样的博客可能会包含...

    rails本地安装包完整版

    1. **activesupport-2.1.0.gem**:ActiveSupport是Rails的一个重要库,提供了许多实用的工具和方法,如时间区处理、字符串格式化、数组和哈希操作等。它也包含了一些核心的Ruby扩展,帮助开发者编写更简洁、更具表达...

    rails2.3.2

    标题 "rails2.3.2" 指的是 Ruby on Rails 框架的一个特定版本,即 2.3.2。Ruby on Rails(通常...虽然现在已经有许多更新的 Rails 版本,但 Rails 2.3.x 对于理解 Rails 的基本原则和工作方式仍具有重要的历史价值。

    rails敏捷开发的购物车系统

    Rails提供了Session存储,可以用来临时存储用户的购物车信息,但这种存储方式不适用于持久保存。因此,通常我们会将购物车内容存入数据库,以便用户在不同会话之间保持购物车状态。在添加或删除商品时,更新购物车...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    rails 项目起步示例

    Rails是Ruby语言的一个著名Web开发...随着对Rails框架的深入理解,你可以逐步构建出功能丰富的购物系统,包括商品浏览、购物车、订单处理等功能。在实际操作中,参考Rails的官方文档和社区资源将是提升技能的好方法。

    使用Aptana+Rails开发Rails Web应用(中文)

    安装过程中,遵循提示进行,确保选择自定义安装并勾选Rails相关的插件,以便在Aptana中获得对Rails的全面支持。 安装完成后,打开Aptana Studio,创建一个新的Rails项目。在“File”菜单中选择“New”然后点击...

    component base rails applications

    本书《Component-Based Rails Applications》主要介绍了如何使用Rails引擎(Rails Engine)进行基于组件的Rails应用开发,以及如何对应用程序的大型模块进行拆分和模块化。以下是书中一些核心知识点的详细说明: 1....

    Rails recipes

    Rails Recipes是一本针对Ruby on Rails框架的实用书籍,它收集了一系列高效解决问题的技巧和方法,也被称为“Rails开发者的宝典”。作者们通过分享自己的经验和见解,为Rails程序员提供了一本既有实际操作指导又有...

Global site tag (gtag.js) - Google Analytics