0

Teradat 14 .NET プロバイダーを使用しています。単一のトランザクションで次の SQL を実行したい:

delete mydb.mytable;
insert into mydb.mytable select * from mydb.myothertable;

私が遭遇したこの問題は、削除は瞬時に行われますが、挿入には数秒かかるということです。削除の後、挿入がコミットされる前に (挿入が実行される前ではなく) 選択が行われた場合、行は返されません。SELECTしたがって、トランザクションがコミットされるまで、 両方のステートメントの結果が他のステートメントから見えるようにしたくありません。IsolationLevel.Snapshot私が望むものに最もよく一致する説明があります:

Reduces blocking by storing a version of data that one application can read while another is modifying the same data. Indicates that from one transaction you cannot see changes made in other transactions, even if you requery.

問題は、Teradata 14 がこのタイプのトランザクションをサポートしていないように見えることです。

The isolation level is not supported by this version of Teradata Database.

トランザクションがコミットされるまで、 deleteandの結果がinsert他のステートメントから見えないようにするにはどうすればよいですか?select

編集

dnoethの回答の後に使用しているコードは次のとおりです。私は Teradata セッションを使用しており、すべての SQL を単一の文字列に入れていますが、削除後、挿入が完了する前に選択が行われた場合、結果は返されません。あなたが提案したように私はそれをやっていますか?SQL でTdTransaction実行しているため、オブジェクトがないことに注意してください。bt;et;

Using con As TdConnection = GetNewConnection()
    Using cmd As TdCommand = con.CreateCommand
        cmd.CommandText = "bt;delete mydb.mytable;insert into mydb.mytable select * from mydb.myview;et;"
        cmd.ExecuteNonQuery()
    End Using
End Using
4

1 に答える 1

1

セッションは ANSI モードまたは Teradata モードで実行されていますか?

トランザクション内で削除/挿入の両方を実行する必要がある場合は、

  • 両方を MultiStatement Request (MSR) として実行します。たとえば、両方とも単一の SQL 文字列を使用して送信します (推奨)

また

  • 明示的な BT を実行します。消去...; 入れる...; ET; Teradata セッションで

ただし、DELETE は遅くなります (トランザクション内の最後のステートメントであり、一時ジャーナルを作成する必要がなかったため、以前はFastPath Deleteでした)。

削除/挿入の間に選択を送信する可能性は低く、回避する必要がある場合は、ビュー切り替えと呼ばれる別の解決策があります。

テーブルの選択は、ビュー x を使用して行う必要があり、テーブルのコピー、tab1 および tab2 を作成する必要があります。

  • tab2 に挿入します。

  • view x を select * from tab2 に置き換えます

  • tab1 から削除 (またはデータを一種のバックアップとして保持)

次回:

  • tab1 に挿入

  • view x を select * from tab1 に置き換えます

  • tab2から削除

等々...

Replaceの前のすべての Select は古いバージョンにアクセスし、 Replaceには短いロックがありすべての新しいSelectは新しいデータにアクセスします。

于 2014-07-24T20:31:01.653 に答える