外部トランザクションをロールバックしようとしましたが、OracleBulkCopy()を中止しようとしましたが、まだすべての行が挿入されました。誰でもこれを行う方法を知っていますか?OracleBulkCopy()挿入行をロールバックする方法はありますか。
ケース1:動作しませんでした。とにかくすべての行が挿入されます。
OracleConnection connection = new OracleConnection(ConnectionString);
connection.Open();
OracleTransaction trans = connection.BeginTransaction();
OracleBulkCopy bulkCopy = new OracleBulkCoopy(connection,OracleBulkCopyOptions.Default);
bulkCopy.DestinationTableName = "SomeTable";
bulkCopy.WriteToServer(SomeDataTable);
trans.Rollback();
ケース2:OracleRowsCopiedEventHandler
デリゲートを使用して、このコールバックでtrue
にOracle.RowsCopiedEventsArgs.Abort
を設定し、catchブロックでトランザクションにロールバックします。どちらもうまくいきませんでした。 Abortコールの前に挿入されたものは、すでにデータベースに入っているようです。 OracleBulkCopy()
はSqlBulkCopy()
よりも劣っています。
ありがとうございました。ホアン
これは私の質問とは関係ありません。バッチごとの内部トランザクションを使用することは、挿入された行の大部分をロールバックするのに役立ちません。基本的に私はすべてをロールバックしたい。たとえば、最初の50Kがすでにコミットされている間に、最後の50Kではなくすべてをロールバックしたい、100K行と途中のどこかに挿入する必要があるとします。 –
私は知っています。私はすべてが正常に動作しているかどうかを確認するテストについて述べました。ドキュメントによると、UseInternalTransactionを使用してBeginTransactionを使用すると、例外が発生します。例外が発生していない場合は、トランザクションが開始されていない可能性があります。 – FerranB
はい、UserInternalTransactionを使用すると例外が発生します。私はそれを試みた。また、CommittableTransactionを明示的な分散トランザクションとして使用しようとしました。これも役に立たなかった。 –