web-dev-qa-db-ja.com

トランザクション内のすべての行を削除します:他のトランザクションはどうなりますか?

私は現在PostgreSQLに一時テーブルを作成し、それを埋め、いくつかのトリッキーな選択を実行して結果を返す関数を持っています。 postgresqlの一時テーブルは関数に対してローカルであるため、これにより、関数の特定の実行によって挿入されたすべての行をマークするために、一時テーブルに別の列を導入することを回避できます。必要となるグローバルテーブルを使用した場合、クエリの性質上、パフォーマンスが低下します。

このコードをVoltDBに移植したいのですが、ストアドプロシージャからの一時テーブルの作成はサポートされていません。これは私に他のアプローチについて考えさせました。ストアドプロシージャがトランザクションを開始し、テーブル内のすべての行(一時的ではない)を削除する場合、その時点で実行されている同じストアドプロシージャの他の実行はどうなりますか?

または、削除後、ストアドプロシージャが行の挿入を開始し、別のセッションが同じspを呼び出した場合、すべての行を再度削除する必要があります。

つまり、すべての行を削除し、いくつかの行を挿入し、挿入された行に対してクエリを実行し、spの実行が終了する(そしてトランザクションがコミットする)前にすべての行を再度削除することで、トランザクション内のデータのローカル(sp実行)ビューを作成できますか? )?

これにより、一時行にrowset_id列を使用することを回避し、結合が大幅に遅くなることを回避できます(これはEAVの実装です)。

6
mahonya

a_horse_with_no_name によるコメントは実際には答えですが、答えとして投稿されていないため、マークを付けることができません。トランザクション分離レベルを完全に忘れてしまいました VoltDBフォーラムで質問しました そしてストアドプロシージャがノードに対してローカルであることを確認する限り(申し訳ありませんが、これは少しですVoltDBの用語)、つまり、パーティション化されたテーブル間でデータを処理しないため、これは機能するはずです。

3
mahonya