【问题标题】:How to manualy commit or rollback in postgres ruby如何在 postgres ruby​​ 中手动提交或回滚
【发布时间】:2017-08-31 00:34:47
【问题描述】:

我在连接到 mysql 数据库的 ruby​​ 脚本中有一些 ruby​​ 代码。当我连接时,我做了一个 MySQL2.query("BEGIN") 来启动一个事务,如果我想回滚我做了 MySQL2.query("ROLLBACK") 或者如果一切都很好并且我想提交我做了 MySQL2.query (“提交”)。

我现在已经转移到 postgres 数据库,而 PG.exec("BEGIN")、PG.exec("ROLLBACK") 和 PG.exec("COMMIT") 似乎没有错误,但我确实收到了警告当我提交时'没有正在进行的事务',所以它似乎正在执行自动提交(即在完成每个 SQL INSERT/UPDATE 时提交)。基本上我希望能够手动回滚或提交。

我想也许我需要关闭自动提交但不知道怎么做,我试过@dbase.exec('SET AUTOCOMMIT TO OFF') 但得到错误'lib/database.rb:28:in `exec':错误:无法识别的配置参数“autocommit”(PG::UndefinedObject)'。

我已经做了相当多的谷歌搜索,但没有任何运气;(。

我正在使用 postgres 9.5 和 ruby​​ 2.4.1。

【问题讨论】:

    标签: ruby postgresql


    【解决方案1】:

    PostgreSQL 没有禁用自动提交的设置:

    https://stackoverflow.com/a/17936997/3323777

    您应该使用 BEGIN/COMMIT/ROLLBACK。 顺便说一句,您使用哪个适配器 gem? PG.exec 语法似乎很奇怪。 考虑以下 sn-p(使用 pg 0.20):

    conn = PGconn.open(:dbname => 'database', user: "user", password: "...")
    
    conn.exec("DELETE FROM setting_entries")
    conn.exec("INSERT INTO setting_entries(name) VALUES ('1')")
    
    conn.exec("BEGIN")
    conn.exec("DELETE FROM setting_entries")
    conn.exec("INSERT INTO setting_entries(name) VALUES ('1')")
    conn.exec("ROLLBACK")
    

    这是 postgre 日志:

    (0-22/70) 2017-08-31 12:37:12 MSK [19945-1] user@database LOG:  statement: DELETE FROM setting_entries
    (0-22/71) 2017-08-31 12:37:12 MSK [19945-2] user@database LOG:  statement: INSERT INTO setting_entries(name) VALUES ('1')
    
    
    (0-22/72) 2017-08-31 12:37:12 MSK [19945-3] user@database LOG:  statement: DELETE FROM setting_entries
    (5948637-22/72) 2017-08-31 12:37:12 MSK [19945-4] user@database LOG:  statement: INSERT INTO setting_entries(name) VALUES ('1')
    

    如您所见,最后两行的事务 ID 相同 (/72)。 为了确保您可以编写一个单元测试,您将在事务中进行两次更新,回滚它们并查看两者是否都会回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2015-06-23
      • 2018-05-27
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多