在学习数据库时,曾经提到事务,最典型的一个实例就是银行转账的问题。
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
分享到:
相关推荐
在添加或删除商品时,更新购物车模型,并确保事务处理正确,以防止数据不一致。 在视图层,使用ERB(Embedded Ruby)模板语言来渲染HTML,展示商品列表和购物车内容。可以创建一个购物车组件(partial),在多个...
- ActiveRecord是如何与数据库交互的,包括查询构造、关联和事务处理。 - Asset Pipeline的工作流程,了解资源的预处理、合并和压缩。 - 控制器和助手类的生命周期,以及如何有效地使用过滤器和before/after actions...
书中会涵盖关联(如has_many, belongs_to, has_one, through)、查询API(如scopes, joins, group, having)以及事务和回调的使用。 4. **测试与持续集成**:测试是保证代码质量的关键。Rails提供了全面的测试支持...
`,以及更强大的事务处理能力。 5. **ActiveResource**:这个组件用于构建RESTful客户端,连接到其他Web服务。虽然在后续版本中被逐渐废弃,但在Rails 3.2中仍然是可用的。 6. **ActionPack**:包含Action...
- **事务处理**:确保数据操作的完整性。 #### 第6章:进阶 ActiveRecord:增强你的模型 继续深化 ActiveRecord 的使用,本章探讨了一些高级主题,如验证、回调、聚合查询等。 - **验证**:确保数据的有效性和...
- **事务回调**:讨论如何在数据库事务中使用回调。 #### ActiveRecord关联 - **为什么使用关联**:解释关联对于简化数据库查询和提高代码可读性的重要性。 - **关联的类型**:列举各种关联类型,包括一对一、一对...
在实际开发中,可能还需要处理诸如时间戳类型转换、字符编码、事务处理等其他问题。此外,SQLServer 2000的安全性和性能可能已经落后,因此升级到更现代的版本,如SQLServer 2012或更高版本,可能会带来更好的开发...
订单状态的跟踪和管理是复杂部分,需要良好的数据库设计和事务处理以确保数据一致性。 5. 支付集成:与第三方支付平台如支付宝、微信支付的接口对接。Rails提供了OmniAuth等库进行身份验证,Stripe、PayPal等支付...
10. **`lock(locked = true)`**:锁定行,防止其他事务修改,例如 `User.lock(true)`。 11. **`readonly(readonly = true)`**:设置查询结果为只读,例如 `User.readonly(true)`。 12. **`from(table_name)`**:指定...
尽管InfluxDB本身不支持事务,但`lib/influxdb/rails/transaction.rb`文件通过模拟事务行为,确保在一组操作中的数据一致性。这在处理多个写入操作时尤为重要,可以避免因单个操作失败而导致的数据不一致。 最后,`...
3. **数据库交互**:Rails使用ActiveRecord作为ORM(对象关系映射),书籍可能会讲解如何创建数据库模式、定义模型关系、执行查询以及事务处理。 4. **MVC架构**:解释Model-View-Controller模式的工作原理,以及...
手册会详细解释ActiveRecord模型,关联,查询接口和事务处理。 4. **Migrations**:Rails中的数据库迁移用于管理和同步数据库结构的变化。手册会教授如何编写和运行迁移,以及回滚到之前的版本。 5. **Views与模板...
8. **查询和事务处理**:Rails中的ActiveRecord提供了一套简单的接口用于执行SQL查询和事务。开发者可以使用`Model.find`、`Model.where`等方法进行数据操作。 9. **性能优化**:由于Oracle和Rails的组合可能涉及更...
### 敏捷Web开发之Rails应用详解(第三版) #### 一、Rails的敏捷特性及其在Web开发中的应用 本书《敏捷Web开发之Rails应用详解》第三版主要介绍了如何使用Ruby on Rails框架来进行敏捷Web开发。Rails是一个用Ruby...
- **事务管理**:解释如何利用Active Record的事务功能来确保数据操作的一致性和完整性。 4. **性能优化** - **懒加载与急加载**:探讨如何合理地配置关联加载策略以减少不必要的数据库查询次数。 - **索引与...