首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在postgres ruby中手动提交或回滚

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

Stack Overflow用户
提问于 2017-08-31 00:34:47
回答 1查看 1.4K关注 0票数 1

我在连接到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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 09:45:50

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

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

您应该使用BEGIN/COMMIT/ROLLBACK。顺便问一下,您使用哪个适配器gem?PG.exec语法似乎很奇怪。请考虑以下代码段(使用了PG-0.20):

代码语言:javascript
复制
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日志:

代码语言:javascript
复制
(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)。为了确保您可以编写一个单元测试,您可以在一个事务中进行两个更新,然后回滚它们,看看两者是否都会回滚。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45971559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档