web-dev-qa-db-ja.com

トランザクション内のテーブルを切り捨て

SQLの「truncate table」コマンドをトランザクション内で使用できますか?アプリを作成していますが、テーブルに大量のレコードがあります。すべてのレコードを削除したいのですが、アプリが失敗した場合はトランザクションをロールバックしました。各レコードの削除には非常に長い時間がかかります。トランケートテーブルを使用している場合、トランザクションがロールバックされ、障害が発生した場合にデータを取り戻すことはできますか。 truncate tableはトランザクションログに各削除を書き込まないことを理解していますが、ロールバックが機能するように、ページの割り当て解除をログに書き込むかどうか疑問に思っています。

54
Davin Studer

SQL Serverでは、トランザクションからTRUNCATEをロールバックできます。あなたが述べたように、ログにページの割り当て解除を書き込みます。

52
womp

Oracleでは、TRUNCATE TABLEはトランザクションで使用できないDDLステートメントです(正確には、ロールバックできません)。 AFAIK、ステートメントの実行時に進行中のトランザクションがある場合、トランザクションはコミットされてからTRUNCATEが実行され、元に戻すことはできません。

Informixでは、TRUNCATEの動作が少し異なります。トランザクションでTRUNCATEを使用できますが、その後許可できるステートメントはCOMMITとROLLBACKだけです。

他のDBMSはおそらく、TRUNCATE TABLEの動作について独自の固有の解釈を持っています。

16