私は、Teradataトランザクションでスナップショット分離に相当するものを実装しようとしています。 Oracleはこの種の分離をサポートしていますが、Teradataは(少なくとも私が認識しているバージョン14以前ではありません)。目標は、テーブルの内容を削除し、それをすべて再読み込みして他のユーザーがテーブルからの読み書きを禁止するプロシージャを作成することです。ストアドプロシージャ内の複数のステートメントでテーブルをロックする
私の理解によれば、オプティマイザは要求内のさまざまなテーブルロックについてすべて知ることができるbegin request
ステートメントを見つけました。
私は以下の手順を書いていますが、.NETアプリケーションでスレッドロックをテストしていれば簡単に確実にデバッグする方法はわかりません(ブレークポイントの設定や他のスレッドの監視が簡単です)。 Teradataでは、私がここに書いたものが、プロシージャーの期間だけ正しくmydb.destinationtable
をロックするかどうかはわかりません。これは正しいです?
編集:私は手順が機能することを追加します。 DELETE/INSERTを実行している間にSELECTを正しく実行できるだけです。
replace procedure mydb.myproc()
begin
begin request
locking mydb.destinationtable for exclusive
delete mydb.destinationtable;
locking mydb.destinationtable for exclusive
insert into mydb.destinationtable
select * from mydb.sourcetable;
end request;
end;
1.データを読み取るために、テーブルではなくビューを使用します。 2.ロード中にビューをドロップします。 3.読み込みが完了したらビューを再作成します。私が知る限り、すべてのロックを処理するmloadを使用することもできます。 – Andrew
ETL中にロードされているテーブル(またはデータベース)に対する要求を拒否(または遅延)するためにTASMを使用しないのはなぜですか?理想的な解決策ではありませんが、ロックの分離に対処しますあるいは、エンド・ユーザーがキュー表のトークンにアクセスしようとする表にアクセスするビューで、ネストされたSELECTステートメントで定義されたキュー表と列を使用できますか。トークンがない場合、照会はQT_DELAYED状態になります。 –
@RobPaller TASMを研究し、キューテーブルの例を見ると、多くの設定やボイラープレートが関わっているようです。彼らは仕事をしないと言っているのではなく、ストアドプロシージャ(つまり、BTEQなどではない)の中で、1)テーブルに排他ロックをかけ、2)複数のステートメントを実行するテーブル)、3)ロックを解除します。dnoethの答え*が表示されます。私のOPコードがそれを正確に実行することを確認しますが、まだわかりませんが一時的なジャーナリングのパフォーマンスが低下する可能性があります。 – oscilatingcretin