ruby - 如何使用 PG Ruby Gem 有条件地回滚事务

标签 ruby postgresql transactions pg

我目前正在上一门数据库类(class),其中一个实验室问题让我困惑于如何实现上述内容,事实上,如果可能的话。我试过搜索 docs但是定义的交易方式比较模糊。

这是我第一次尝试在没有 Rails 的情况下进行任何数据库操作,所以我有点迷茫。我已经成功地创建了一个到我的 postgresql 数据库的连接并且可以执行语句,我需要做的最后一件事是根据一个简单的条件回滚一个事务。

请允许我向您展示代码:

require 'pg'
@conn = PG::Connection.open(:dbname => 'db_15_11_labs')
@conn.prepare('insert', 'INSERT INTO house (housenumber, street) VALUES ($1, $2) returning id')
@words = ["Foo", "Bar", "Bash", "Bang"]

def populate
  100.times.each_with_index do |i|
    # cycle through the @words array for street names, use i as house number
    ins = @conn.exec_prepared('insert', [i, "#{@words1[i % 4]} street"])
  end
end

基本上,条件是如果返回的 id (ins[0]['id']) 是偶数,则回滚事务。我认为如果 ins[0]['id'] % 2 == 0 我需要抛出某种异常,但我该怎么做,更重要的是,我如何将该信息编码成docs 中给出的语法?

感谢您的宝贵时间。

编辑 1

我现在已经设法获得允许将条件放置在定义的事务中的语法,如下所示:

@conn.transaction do |conn|
    ins = @conn.exec_prepared('insert', [i, "#{@words1[i % 100]} street"])
end

所以这个问题真的变成了“当 ins[0]['id'] % 2 == 0

时我如何抛出并捕获异常

我已经尝试遵循一些关于引发异常的简单教程,但执行以下操作:

throw :id_exception if (@ins[0]['id'].to_i % 2) == 0
    catch :id_exception do
    puts "caught :id_exception #{}"
end

在交易中导致 'throw': uncaught throw :id_exception (ArgumentError)

最佳答案

如果 block 内引发异常,事务会自动回滚。因此,您只需要为自己创建一个小的异常类,在 block 内引发一个,然后安排拯救它,这样您的程序就不会因为引发的异常而错误退出。

尝试这样的事情:

class MyLittleIdError < StandardError
end

begin
  @conn.transaction do |conn|
    ins = conn.exec_prepared('insert', [i, "#{@words1[i % 100]} street"])
    raise MyLittleIdError if (ins[0]['id'].to_i % 2) == 0
  end
rescue MyLittleIdError
  puts "aha! we have rolled back."
end

关于ruby - 如何使用 PG Ruby Gem 有条件地回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20051912/

相关文章:

ruby-on-rails - 升级到 ruby​​ 2.3.0 NameError: uninitialized constant I18n::Config::Backend

json - Rswag 模式不会因数组中对象的无效属性而失败

ruby-on-rails - 如何使用 boolean 值创建接受/拒绝按钮?

postgresql - yacc函数中的@符号是什么意思

postgresql - Postgres 查询的性能

sql - 使用 oid 作为主键

java - 在 View 中打开 session 与@Transactional

java - 使用 CompleteableFuture 和 Spring Transaction 耗尽池

ruby - TryRuby 为 String 引发未定义的方法 `[]='

transactions - 是什么导致Arjuna 1603(找不到新的XAResource用于恢复不可序列化的XAResource)