sql >> データベース >  >> RDS >> Sqlserver

ネストされたトランザクションの内部トランザクションをロールバックします

    SQL Serverは、ネストされたトランザクションを実際にはサポートしていません。一度に1つのトランザクションしかありません。

    この1つのトランザクションには、基本的なネストされたトランザクションカウンター、@@TRANCOUNTがあります。 。連続する各begin transaction commit transactionごとにカウンターを1つずつ増やします それを1つ減らします。 commitのみ カウンターを0に減らすと、実際に1つのトランザクションがコミットされます。

    rollback transaction 1つのトランザクションを元に戻し、@@TRANCOUNTをクリアします 。

    あなたの場合、面白い結果はSqlStatement3が外部で実行されることです。 トランザクション!最後のcommit 「COMMITTRANSACTIONリクエストには対応するBEGINTRANSACTIONがありません」という例外がスローされますが、SqlStatement3の効果は永続的です。

    例:

    create table #t (col1 int)
    insert #t (col1) values (1)
    BEGIN TRANSACTION
    update #t set col1 = 2 -- This gets rolled back
    BEGIN TRANSACTION
    update #t set col1 = 3 -- This gets rolled back too
    ROLLBACK TRANSACTION
    update #t set col1 = 4 -- This is run OUTSIDE a transaction!
    COMMIT TRANSACTION -- Throws error
    select col1 from #t
    

    4を出力します 。本当。 :)



    1. Mysql:1か月あたりのレコード数(ゼロを含む)

    2. 空の文字列をoracleClobに更新する方法

    3. 制限に相当するものを区別するにはどうすればよいですか?

    4. Rails 3アプリのMySQLクラスター(NDB)とMySQLレプリケーション(InnoDB):長所/短所?