`
mlzboy
  • 浏览: 726484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

 

博客统计信息

51cto推荐博客 
用户名:fsjoy1983
文章数:301
评论数:209
访问量:216647
无忧币:2384
博客积分:3838
博客等级:7
注册日期:2008-02-04

 

我的技术圈(3)

更多>>
 
 rails实现“事务”的方法
2008-09-02 12:48:14
标签:rails 事务
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://fsjoy.blog.51cto.com/318484/96738
在学习数据库时,曾经提到事务,最典型的一个实例就是银行转账的问题。
A帐户向B帐户转账100块,这个事情一定要发生两件事情,A的帐户上减去100块,B的账户上加上100块。如果半路发生问题而中断这个事情,那么必须回滚到初始状态。
下面来看一下用rails来实现这个例子:

首先,建立模型类account, 数据迁移:

在account类中定义方法:

实施数据迁移。运行console

>> peter = Account.create(:balance=>100, :number=>"12345")
>> paul = Account.create(:balance=>200, :number=>"54321")
#create直接创建并保存到accounts表中
现在数据库中的内容#SELECT * FROM account_development.account


继续在console里运行:
>> Account.transaction do
?> paul.deposit(10)
>> peter.withdraw(10)
>> end
此时数据库中的内容:


现在再来看看异常情况,1.从peter帐户上转350出去给peter
>> Account.transaction do
?> paul.deposit(350)
>> peter.withdraw(350)
>> end
------
这时抛出了异常:
ActiveRecord::RecordInvalid: Validation failed: Balance is negative!
---数据库还是保持原样:

2.从peter账户上转10出去给tom

>> Account.transaction do
?> paul.deposit(10)
>> tom.withdraw(10)
>> end

----抛出异常:
NameError: undefined local variable or method `tom' for #<Object:0x389a0>
数据库依然保持原样。

虽然数据库依然保持原样,但是模型对象会发生变化,look:

现在还是恢复原状,peter有100块,paul有200块


现在执行:

结果出乎意料, 
Transfer aborted!
Paul has  550.0
peter has -250.0

模型对象已经被改变了!
原因就在于ActiveRecord并没有跟踪对象在事务前后的状态,实际上它也跟踪不了, 因为没有一种简单的办法可以知道哪些模型对象参与了事务。为了解决这个问题,我们可以把涉及一次事务的模型对象以参数的形式明确的告诉transaction




这次结果就跟我们料想的一样了:

T
分享到:
评论

相关推荐

    rails敏捷开发的购物车系统

    在添加或删除商品时,更新购物车模型,并确保事务处理正确,以防止数据不一致。 在视图层,使用ERB(Embedded Ruby)模板语言来渲染HTML,展示商品列表和购物车内容。可以创建一个购物车组件(partial),在多个...

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    - ActiveRecord是如何与数据库交互的,包括查询构造、关联和事务处理。 - Asset Pipeline的工作流程,了解资源的预处理、合并和压缩。 - 控制器和助手类的生命周期,以及如何有效地使用过滤器和before/after actions...

    Advanced Rails

    书中会涵盖关联(如has_many, belongs_to, has_one, through)、查询API(如scopes, joins, group, having)以及事务和回调的使用。 4. **测试与持续集成**:测试是保证代码质量的关键。Rails提供了全面的测试支持...

    rails 3.2 API

    `,以及更强大的事务处理能力。 5. **ActiveResource**:这个组件用于构建RESTful客户端,连接到其他Web服务。虽然在后续版本中被逐渐废弃,但在Rails 3.2中仍然是可用的。 6. **ActionPack**:包含Action...

    Beginning Rails 4

    - **事务处理**:确保数据操作的完整性。 #### 第6章:进阶 ActiveRecord:增强你的模型 继续深化 ActiveRecord 的使用,本章探讨了一些高级主题,如验证、回调、聚合查询等。 - **验证**:确保数据的有效性和...

    Ruby on Rails 指南 v5.0.1 中文版

    - **事务回调**:讨论如何在数据库事务中使用回调。 #### ActiveRecord关联 - **为什么使用关联**:解释关联对于简化数据库查询和提高代码可读性的重要性。 - **关联的类型**:列举各种关联类型,包括一对一、一对...

    rails配置sqlserver2000

    在实际开发中,可能还需要处理诸如时间戳类型转换、字符编码、事务处理等其他问题。此外,SQLServer 2000的安全性和性能可能已经落后,因此升级到更现代的版本,如SQLServer 2012或更高版本,可能会带来更好的开发...

    Ruby-Rails实战之B2C商城开发

    订单状态的跟踪和管理是复杂部分,需要良好的数据库设计和事务处理以确保数据一致性。 5. 支付集成:与第三方支付平台如支付宝、微信支付的接口对接。Rails提供了OmniAuth等库进行身份验证,Stripe、PayPal等支付...

    Rails3的ActiveRecord 查询API.doc

    10. **`lock(locked = true)`**:锁定行,防止其他事务修改,例如 `User.lock(true)`。 11. **`readonly(readonly = true)`**:设置查询结果为只读,例如 `User.readonly(true)`。 12. **`from(table_name)`**:指定...

    influxdb-rails-源码.rar

    尽管InfluxDB本身不支持事务,但`lib/influxdb/rails/transaction.rb`文件通过模拟事务行为,确保在一组操作中的数据一致性。这在处理多个写入操作时尤为重要,可以避免因单个操作失败而导致的数据不一致。 最后,`...

    Rails相关电子书汇总二

    3. **数据库交互**:Rails使用ActiveRecord作为ORM(对象关系映射),书籍可能会讲解如何创建数据库模式、定义模型关系、执行查询以及事务处理。 4. **MVC架构**:解释Model-View-Controller模式的工作原理,以及...

    rails 开发手册

    手册会详细解释ActiveRecord模型,关联,查询接口和事务处理。 4. **Migrations**:Rails中的数据库迁移用于管理和同步数据库结构的变化。手册会教授如何编写和运行迁移,以及回滚到之前的版本。 5. **Views与模板...

    结合使用 Oracle 和 Ruby on Rails 教程

    8. **查询和事务处理**:Rails中的ActiveRecord提供了一套简单的接口用于执行SQL查询和事务。开发者可以使用`Model.find`、`Model.where`等方法进行数据操作。 9. **性能优化**:由于Oracle和Rails的组合可能涉及更...

    Agile Web Development with Rails中文版 3rd Edition

    ### 敏捷Web开发之Rails应用详解(第三版) #### 一、Rails的敏捷特性及其在Web开发中的应用 本书《敏捷Web开发之Rails应用详解》第三版主要介绍了如何使用Ruby on Rails框架来进行敏捷Web开发。Rails是一个用Ruby...

    Pro Active Record. Databases with Ruby and Rails

    - **事务管理**:解释如何利用Active Record的事务功能来确保数据操作的一致性和完整性。 4. **性能优化** - **懒加载与急加载**:探讨如何合理地配置关联加载策略以减少不必要的数据库查询次数。 - **索引与...

Global site tag (gtag.js) - Google Analytics