gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:18:18 25 4
gpt4 key购买 nike

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

最佳答案

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')

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

关于ruby - 如何在 postgres ruby​​ 中手动提交或回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45971559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com