2017-01-12 14 views
0

私はこれをテストしようとしてきましたが、決定的な答えを得ることができませんでした。私はMySQLの上でSQLAlchemyを使用しており、選択を行うスレッドを防ぐために、SHARED_READをいくつかのテーブルにロックし、それを保持します(解放されるまで、将来のDDL操作を防止します)。これは、照会がコミットされない場合に発生します。私は.execute()がモードで本質的に動作し、COMMITを発行するとSQLAlchemy Coreを使用しています。それにもかかわらず、show processlistでは、一度問い合わせたテーブルにまだSHARED_READのロックを持つスリープスレッドが表示されています。何がありますか?SQLAlchemy Coreでのコミットはいつ行われますか?

答えて

1

あなたのポストからは、SQLAlchemy Connection(進行中のトランザクションなし)または簡略engine.execute()のいずれかを使用して、「非トランザクション」モードで動作していると仮定します。この動作モードでは、SQLAlchemyはINSERT,UPDATEDELETE、およびDDL文を検出し、自動的に後でコミットを発行しますが、SELECT文のようにすべてではありません。 "Understanding Autocommit"を参照してください。

conn.execute(text('SELECT ...').execution_options(autocommit=True)) 

を使用し、コミット必要がないストアドプロシージャと、そのような変異を選択するためにあなたはまた、スレッドが当分の間、彼らと一緒に行われたときに接続を閉じる検討すべきです。クローズすると、基礎となるDBAPI接続にrollback()が呼び出されます。これは、PEP-0249が(おそらく)常にトランザクション状態です。これにより、トランザクション状態やロックが解除され、接続プールに接続が返されます。この方法では、自動コミットしない選択について心配する必要はありません。

関連する問題