いつもお世話になっております、少し質問させてください。
SQLSERVERにBDEのネィティブドライバーで接続しています。
ロックのかかったデータをそのまま読める(DirtyRead:Read UNCOMMITTED)ようにと考えていますが、
TDatabase.TransIsolationにDirtyReadが指定できないので、
コネクト後に「SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED」を発行し、
その後SELECTストアドを実行しています。
仮にAテーブルに対し、トランザクションスタート、インサートで放置(ロック状態)して、
セレクトのストアドを実行すると、待ちになります。
そこで、コネクト後の「SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED」を発行するのをやめて、
ストアドを実行しているクエリーの1行名に「SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED」
を記述するとセレクトできます。
また、ストアド内のSELECT分のテーブル個別にWITH (NOLOCK)を記述することでもセレクトはできます。
ただ、都度、記述するのが、面度なので、一括でISOLATION LEVELをREAD UNCOMMITTEDとしたいのですが、どのようにすれば良いでしょうか。
もうひとつ、Aテーブルに対して、トランザクションスタート→インサート→放置 の状態で、SELECT * FROM Aとすると、
ISOLATION LEVELがREAD COMMITTEDで待ち状態になります。
ISOLATION LEVELがREAD COMMITTED:他のトランザクションによるデータベースへのコミットされた(永続的な)変更内容だけを読み出せる。
とありますが、インサートによってロックがかかっているデータを読み飛ばすのではなく、
ロックがかかっているデータがあるから待ちになっていると考えて良いでしょうか。
また、このデータを読み飛ばすには、READPASTを都度指定する方法で良いのでしょうか。
よろしくお願いします。
クエリーに「TRANSACTION ISOLATION LEVEL READ UNCOMMITTED」SQLを入力してEXEC.SQLを実行した場合はだめでしたが、
TDatabase.Execute('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
とするとうまく動きました。
しかし、なにか訳があるのかな......
ツイート | ![]() |