Rails开发细节(四)Transactions事务

事务在数据库应用开发中是相当重要的,尤其是在关系数据库中。典型的例子就是银行在转账,在两个账 户之间转账。

account1.deposite(100) 

account2.withdraw(100)

在ActiveRecord中使用transaction方法执行一段block来实现事务。在 block的最后,会提交事务,更新数据库,如果在block中发生异常,数据库会回滚所有改变。

Account.transaction do
  account1.deposite(100) 

  account2.withdraw(100)
end

下面是一个完整的例子,我们创建一个表格,有两个字段:账号和余额。

定义一个 Account类,包含deposit存钱和withdraw取钱两个方法。

create_table :accounts, :force => 

true do |t|
  t.string :number
  t.decimal :balance, :precision => 10, :scale => 2, :default => 0
end 

class Account < ActiveRecord::Base
  validate :price_must_be_at_least_a_cent 

  def withdarw(amount)
    adjust_balance_and_save(-amount)
  end 

  def deposit(amount)
    adjust_balance_and_save(amount)
  end 

  def adjust_balance_and_save(amount)
    self.balance += amount
    save!
  end 

  def price_must_be_at_least_a_cent
    errors.add(:balance, "is negative") if balance < 0
  end
end 

peter = Account.create(:balance => 100, :number => "12345")
paul = Account.create(:balance => 200, :number => "23456") 

Account.transaction do
  paul.deposit(10)
  peter.withdraw(10)
end

我们可以通过

select * from accounts

查询一下数据,看看账户信息是否正确。

peter = Account.create(:balance => 100, :number => "12345")

paul = Account.create(:balance => 200, :number => "23456")

 

Account.transaction do

 paul.deposit(350)

 peter.withdraw(350)

end

再来试试异常的情况,再 来查查数据库,看看数据有没有回滚到初始值。

在异常的情况下,我们输出model对象的值看看。

puts "Paul has #{paul.balance}"
puts "Peter has #{peter.balance}"

我们会发现虽然数据库没有破坏,但是model对象的值被修改 了。这是因为ActiveRecord没有跟踪对象的状态变化,事实上它也做不到。如果在你的应用中这是一个问题的 话,你可以求助于object_transactions插件。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, number
, end
, transaction
account
rails 事务、rails save事务延迟、rails api开发、rails 微信开发、rails开发工具,以便于您获取更多的相关知识。

时间: 2024-10-28 11:28:03

Rails开发细节(四)Transactions事务的相关文章

Rails开发细节(九)Rails的测试

1.为什么写测试 rails使得我们很容易就可以写测试.在创建model和controller的时候,rails帮助我们创建了测试的骨架代码. 通过简单的运行你的测试代码,你可以确保你的代码在重构之后任然满足需求的功能. rails测试可以模拟浏览器请求,这样你就可以在不适用浏览器的情况下测试应用的响应情况. 2.测试简介 因为每一个rails应用都会和数据库有大量的交互,因此你的测试也需要一个数据库来进行交互.为了更好的写测试,你需要知道如何建立数据库,以及加载样本数据. 2.1.三个环境 每

Rails开发细节(八)Rails应用的安全

看过本文之后,你应该熟悉下面的内容: 所有显著的对策. rails中session的概念,其中存放的内容,常见的攻击手段. rails中大量的分配问题. 在提供管理接口的时候,你不得不关注的一些事情. 如何管理用户:登陆,退出,在各个层面的攻击方法. 常见的注入攻击方法. 1.简介 web框架帮助开发者构建web应用.它们中的一些还可以帮助你构建安全的web应用.事实上一个框架并不比两一个框架安全,如果你正确的使用,你可以用很多框架构建安全的web应用.rails包含一些聪明的帮助工具,例如防止

Rails开发细节(五)Migrations 数据迁移

1.简介 在rails中用migration可以很方便的管理数据库的结构.可以创建数据库,创建表,删除表,添加字段,删除字段,整理数据. migration就是一系列的class,这些类都继承了ActiveRecord::Migration类. class CreateProducts < ActiveRecord::Migration def up create_table :products do |t| t.string :name t.column :description, :text

Rails开发细节(三)Participating in the Monitoring Process

Participating in the Monitoring Process 参与监控过程 ActiveRecord控制着model对象 的生命周期,它创建它们,在修改,保存和更新的时候监控它们,并且在删除的时候也进行监控.使用回调函 数,ActiveRecord允许我们的代码参与这个监控过程. ActiveRecord总共定义了20个回调函数.18个 成对的before和after,还有两个例外:after_find和after_initialize. 开发细节(三)Participatin

Rails开发细节(二)CRUD

Create & Save 创建 & 保存 order = Order.new order.name = "virusswb" order.email = "asdf@exmaple.com" order.save 调用save方法之后就可以保存到数据库了. 还可以用block来创建并保存. Order.new do |order| order.name = "virusswb" order.email = "asdf@

Rails开发细节(一)

常用命令 rails new new_app cd new_app rake db:create rails server rails generate controller Blog action1 action2 rails generate scaffold Product title:string description:text rails generate model Comment commenter:string body:text post:references rake db

Rails开发细节(七)ActiveRecord Associations关联

1.为什么需要关联 很多时候,比如说电子商务中的用户和订单,一个用户会有很多的订单,一个订单只属于一个用户,这就是一种关联. 在创建订单的时候需要用户主键作为外键,删除用户的的同时需要删除用户的订单. 在rails中可以向下面这样订单关联. class Customer < ActiveRecord::Base has_many :orders, :dependent => :destroy end class Order < ActiveRecord::Base belongs_to

Rails开发细节(六)ActiveRecord Validationa and Callbacks验证和回调

1.对象生命周期 通常情况下,在rails应用中,对象会被创建,修改和删除.ActiveRecord针对这些对象提供了拦截,你可以控制你的应用和这些对象. 验证保证了存入数据库的数据都是有效的.回调和观察者允许你在对象状态发生变化的前后进行一些逻辑操作. 2.验证 2.1.为什么需要验证 验证保证了只有合法的数据才可以存入数据库.例如,你的应用需要确保每个用户都拥有合法的电子邮件地址和邮寄地址. 在存入数据库之前,有很多方法可以验证数据的合法性.包括数据库约束,客户端的验证,controller

Ruby on rails开发从头来(windows)(四)-第一个添删查改例子

在上一篇Ruby on rails开发从头来(windows)(三)-实现页面间的跳转中,我们创建了两个页面来进行跳转迁移,这次我们来写一个单表维护的添删查改的例子. 1.这次我们重新创建一个项目depot,按照上篇中的步骤,创建depot项目. 2.创建数据库. 你可以使用rails的命令行,通过mysql创建,先定位到depot目录,使用命令: depot> mysql -u root –p 密码为空,连接mysql后执行下面的命令: mysql> create database depo