2016-04-04 16 views
0

SQLロールバック・トランザクションでは、そこから状態をロールバックしますか?私は、データがどこに格納されているので、ロールバックで戻すことができます。SQLロールバック・トランザクションでは、そこから状態をロールバックしますか?

+1

これは実装固有のものです。 –

+0

トランザクションログ。 SQL SQL Serverで更新が行われると、まずトランザクションログ内でデータが書き込まれ、ロールバックされるとt-logエントリが削除され、DBの状態はトランザクション前と同じになります起こりました。 * SQL Server固有の編集* – Jeremy

答えて

0

Oracleでは、コミットするまでREDOログの変更を保存しています。すべてのRDMSには独自の戦略があります。

+0

Oracleでは、実際にはUNDOであり、REDOではありません。 –

0
あなたがそれらオフを実行し、100%(クエリのすべての行を実行します)、またはまったく実行いずれかのために安全で簡単なコードを使用することができます

|クエリ1 | =のように挿入するか、または選択するか... ... |行数| =数オフクエリ

DECLARE @rowcount int set @rowcount = 0 ; 
 
    BEGIN TRANSACTION [Tran1] 
 
    BEGIN TRY 
 
    <Query 1> ; set @rowcount = (@rowcount + @@ROWCOUNT); 
 
    <Query 2> ; set @rowcount = (@rowcount + @@ROWCOUNT); 
 
    ... 
 
    IF @rowcount = <count of lines> 
 
     COMMIT TRANSACTION[Tran1] 
 
    ELSE 
 
     ROLLBACK TRANSACTION[Tran1] 
 
    END TRY 
 
     BEGIN CATCH 
 
     ROLLBACK TRANSACTION[Tran1] 
 
    END CATCH

例えば、このコードの実行2挿入彼または全く実行もののすべてを実行し、ロールバックラインクエリになく、または

DECLARE @rowcount int set @rowcount = 0 ; 
 
    BEGIN TRANSACTION [Tran1] 
 
    BEGIN TRY 
 
    insert into [database].[dbo].[tbl1] (fld1) values('1') ; 
 
     set @rowcount = (@rowcount + @@ROWCOUNT); 
 
    insert into [database].[dbo].[tbl2] (fld1) values('2') ; 
 
     set @rowcount = (@rowcount + @@ROWCOUNT); 
 

 
    IF @rowcount = 2 
 
     COMMIT TRANSACTION[Tran1] 
 
    ELSE 
 
     ROLLBACK TRANSACTION[Tran1] 
 
    END TRY 
 
     BEGIN CATCH 
 
     ROLLBACK TRANSACTION[Tran1] 
 
    END CATCH

関連する問題