我在连接到mysql的ruby脚本中有一些ruby代码。当我连接时,我执行了一个MySQL2.query("BEGIN")来启动一个事务,如果我想回滚,我做了MySQL2.query(" rollback "),或者如果一切顺利并且我想提交,我执行MySQL2.query(" commit ")。
现在我移到了postgres数据库,虽然PG.exec("BEGIN")、PG.exec("ROLLBACK")和PG.exec(" commit ")似乎没有出错,但我确实收到了一个警告:‘在提交时没有正在进行中的事务’,所以它似乎在执行自动提交(即,在完成时提交每个SQL /UPDATE)。基本上,我希望能够手动回滚或提交。
我想我可能需要关闭自动提交,但无法解决,我尝试了@dbase.exec(‘将autocommit设置为OFF'),但得到了错误’lib/database.rb:28:在‘`exec':ERROR:未识别的配置参数“自动提交”(PG::UndefinedObject)’。
我做了相当多的谷歌,没有任何运气;
我使用postgres 9.5和ruby 2.4.1。
发布于 2017-08-31 09:45:50
PostgreSQL没有禁用自动提交的设置:
https://stackoverflow.com/a/17936997/3323777
您应该使用BEGIN/COMMIT/ROLLBACK。顺便问一下,您使用哪个适配器gem?PG.exec语法似乎很奇怪。请考虑以下代码段(使用了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')如您所见,对于最后两行,事务ids是相同的(/72)。为了确保您可以编写一个单元测试,您可以在一个事务中进行两个更新,然后回滚它们,看看两者是否都会回滚。
https://stackoverflow.com/questions/45971559
复制相似问题