PostgreSQL で基本的な実験を行いたいと考えています。たとえば、デッドロックを生成したり、反復不可能な読み取りを作成したりします。しかし、一度に複数のトランザクションを実行してそのような動作を確認する方法がわかりませんでした。誰か私にアイデアを教えてもらえますか?
3 に答える
psql
セッションごとに 1 つの端末で、複数のセッションを開きます。
Windows を使用している場合はpsql
、[スタート] メニューから複数回起動することで実行できます。他のプラットフォームでは、いくつかの新しいターミナルまたはターミナル タブを開き、psql
それぞれで開始します。
ロックと同時実行の問題を調べるときは、次のような回答で使用されます。
...おそらくもっと。競合状態を設定したい場合に役立つトリックは、3 番目のpsql
セッションを開いてBEGIN; LOCK TABLE the_table_to_race_on;
. 次に、他のセッションでステートメントを実行します。彼らはロックをブロックします。ROLLBACK
テーブル ロックを保持しているトランザクションと他のセッションが競合します。オフセット開始時間の同時実行をシミュレートしないため、完全ではありませんが、それでも非常に役立ちます。
他の代替案は、同様のトピックに関するこの後の回答で概説されています。
pgbench は、おそらくあなたの場合の最良のソリューションです。さまざまな複雑なデータベース リソースの競合、デッドロック、マルチクライアント、マルチスレッド アクセスをテストできます。
ディロックを取得するには、次のようなスクリプト ('bench_script.sql) を使用するだけです。
DECLARE cnt integer DEFAULT 0;
BEGIN;
LOCK TABLE schm.tbl IN SHARE MODE;
select count(*) from schm.tabl into cnt;
insert into schm.tbl values (1 + 9999*random(), 'test descr' );
END;
-f パラメータを付けて pgbench に渡します。
より詳細な pgbench の使用法については、postgreSQL pgBenchの公式マニュアルを読むことをお勧めします。
ここで最近解決された私のpgbenchの質問に慣れてください。
Craig Ringer は、複数のトランザクションを手動で開く方法を提供しています。これがあまり便利でない場合は、一度に複数のトランザクションを実行するpgbenchを使用できます。