如何在postgres ruby​​中手动提交或回滚

时间:2017-08-31 00:34:47

标签: ruby postgresql

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

我现在已移至postgres数据库,而PG.exec(“BEGIN”),PG.exec(“ROLLBACK”)和PG.exec(“COMMIT”)似乎没有错误我收到警告当我提交时,“没有正在进行的事务”它似乎正在进行自动提交(即,提交每个SQL INSERT / UPDATE)。基本上我希望能够手动回滚或提交。

我想也许我需要关闭autocommit但是无法解决问题,我尝试了@ dbase.exec('SET AUTOCOMMIT TO OFF')但得到错误'lib / database.rb:28:in`exec':错误:无法识别的配置参数“autocommit”(PG :: UndefinedObject)'。

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

我正在使用postgres 9.5和ruby 2.4.1。

1 个答案:

答案 0 :(得分:1)

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

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

你应该使用BEGIN / COMMIT / ROLLBACK。 BTW你使用哪个适配器宝石? PG.exec语法似乎很奇怪。 请考虑以下代码段(使用第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)。 为了确保你可以编写一个单元测试,你可以在一个事务中进行两次更新,回滚它们,看看它们是否会回滚。