2017-08-31 37 views
1

Rubyスクリプトにmysql DBに接続されたRubyコードがありました。私が接続したら、MySQL2.query( "BEGIN")を実行してトランザクションを開始し、ロールバックしたい場合はMySQL2.query( "ROLLBACK")を実行しました。 ("コミット")。postgres ruby​​を手作業でコミットまたはロールバックする方法

PG.exec( "BEGIN")、PG.exec( "ROLLBACK")、PG.exec( "COMMIT")のエラーが発生していないようですが、postgresデータベースに移動しました。コミットするときに「進行中のトランザクションはありません」という警告が表示されるので、自動コミット(つまり、完了したSQL INSERT/UPDATEをコミットしている)のようです。基本的に私は手動でロールバックまたはコミットできるようにしたい。

私はautocommitをオフにする必要があるかもしれないと思いますが、@ dbase.exec( 'SET AUTOCOMMIT TO OFF')を試しましたが、 'lib/database.rb:28:exec: :ERROR:認識できない設定パラメータ "autocommit"(PG :: UndefinedObject) '。

:(

私はpostgresの9.5とルビー2.4.1を使用しています

答えて

0

PostgreSQLは自動コミットを無効にする設定はありません。

アイブ氏は運なしでグーグルのかなりの量を行って。 。?あなただけのコミット/ロールバック/ BEGIN使用する必要がありますhttps://stackoverflow.com/a/17936997/3323777

ところでどのアダプタ宝石あなたが使っています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] [email protected] LOG: statement: DELETE FROM setting_entries 
(0-22/71) 2017-08-31 12:37:12 MSK [19945-2] [email protected] LOG: statement: INSERT INTO setting_entries(name) VALUES ('1') 


(0-22/72) 2017-08-31 12:37:12 MSK [19945-3] [email protected] LOG: statement: DELETE FROM setting_entries 
(5948637-22/72) 2017-08-31 12:37:12 MSK [19945-4] [email protected] LOG: statement: INSERT INTO setting_entries(name) VALUES ('1') 

あなたが見ることができるように、トランザクションIDは、最後の2行のために(/ 72)と同じです。 トランザクション内で2つの更新を行うユニットテストを作成し、それらをロールバックして両方がロールバックするかどうかを確認することができます。

関連する問題