2016-06-11 19 views
1

私は、lib/pqのPostgreSQLドライバを使用して、Goのデータベース/ sqlパッケージで異常な動作を確認しました。基本的に、同じ接続でトランザクションを構築しているときにクエリにデータベース接続を使用すると、デッドロックが発生し、プログラムがブロックされます(データベースサーバを手動で再起動して再度動作させる必要があります)。次の例のコードでは、select文でスタックされ、2番目のinsert文は実行されません(クエリを削除するとコードは正常に実行されます)。golangデータベース/ sqlのデッドロック

tx, _ := connection.Begin() 
tx.Exec(insert_statement) 
rows, _ := connection.Query(select_statement) 
rows.Close() 
tx.Exec(insert_statement_2) 
tx.Commit() 

これは正常ですか?トランザクションを使用するたびに新しいデータベース接続を作成する必要がありますか?

答えて

0

connection.Query関数は、insert_statementによって書き込まれたものをselect_statementが参照する場合、tx.XXX関数と同じセッションでは実行されません。ブロックする可能性があります。

tx.Query(select_statement)を試して、そのブロックがあるかどうかを確認してください。

+0

はい、tx.Query()は機能しますが、いつもそれを制御することはできません。トランザクションtxは管理者によってdbへのいくつかの更新を行うために使用され、クエリーはウェブサイトを訪れるユーザによって呼び出される。だから、2つのことが同時に起こるかもしれませんし、私のデータベースをシャットダウンしないと好きです! – splinter123

+0

私は、同じゴルーチン内でバック・トゥ・バックに実行されたときに、これがデッドロックすると予想します。別のルーチンがさまざまなことを実行しているときにこの問題が発生しますか?また、postgresqlのSELECT文は、 "更新のため"を行わない限りロックされません。そうしていますか? –

+0

私は別のgoroutinesでそれをテストしていませんでしたが、同じスレッドで別のことをすることで、並行動作を素直に再現しようとしていましたが、おそらく良い方法ではありません。 select文は単なる "select * from mytable"です。ここでは、同じ "mytable"が前の挿入によって変更されています。 – splinter123

関連する問題