2017-02-16 4 views
-2

私はトランザクション分離レベルについて読んできましたが、すべてを正しく理解しているかどうかはわかりません。私は助けが必要です。トランザクション分離レベルの問題

次CSHARPの擬似コードを検討してください:データに基づいて、表2を挿入または更新、ストアドプロシージャの2を使用して、ストアド・プロシージャ1、開いているトランザクション

  • 挿入または更新テーブル1
  • を使用して

    1. をテーブル1上で
    2. トランザクションをコミットします。

    手順3では、手順2で更新されたデータはどのように考慮できませんか。 .Netコードでトランザクションを作成しているときに、トランザクション分離レベルを設定する必要があります。 SQLサーバーストアドプロシージャの擬似コードを次に示します。

    select @count=count(*) from table1; 
    if @count > 1 
    update table2 
    
  • +0

    明確にする。ステップ2の前と同じように、ステップ3でテーブル1のデータを確認しますか? –

    +0

    @DanDef:10,000フィートのレベルで、それは本当です。 100フィートのレベルでは、ステップ3ははるかに多くなり、ステップの順序を変更することはできません。 –

    答えて

    1

    注文を変更しても問題は解決しません。つまり、ステップ2で表1のデータが変更され、ステップ3を実行するためにそのまま使用する必要がある場合は、まずステップ3を実行します。それは次のようになります。あなただけコメントしたものを考えると


    手順1

  • 閉じるトランザクションを実行手順2
  • を実行

    1. オープン取引
    2. 、あなたはおそらく必要があるだろうIsolationLevel.Snapshotを使用してください。ただし、一部のデータベースでは、デフォルトでが有効になっています。ソーステーブルを更新すると、基本的にtempdbに現在のデータのコピーが作成されました。

  • +0

    10,000フィートのレベルで、あなたは正しいです。 100フィートのレベルでは、ステップ3ははるかに多くなり、ステップの順序を変更することはできません。 –

    0

    私の知る限り、一度変更された行の以前のバージョンにはアクセスできません。

    あなたが求めていることを達成するには、ステップ2を変更して、変更されたものを追跡してステップ3で使用できるようにする必要があります。それ以外の場合は、ステップ2で変更したテーブルにトリガを追加する必要があります。そのように変更を追跡します。

    関連する問題