0

トランザクション内で取得されたデータベース ロックは、トランザクションの終了時に解放されることはよく知られています。したがって、このコードでは..

public static TransactionScope CreateTransactionScope()
{
    return new TransactionScope(TransactionScopeOption.Required,
     new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted });
}

実はこの中に…

using (DataContext dataContext = new DataContext())
using (TransactionScope rootScope = CreateTransactionScope())
{
    using (TransactionScope nested = CreateTransactionScope())
    {
        Ticket ticket = dataContext.ExecuteQuery<Ticket>(
          "SELECT * FROM Tickets WITH (UPDLOCK) WHERE id={0}", ticketId).First();
        nested.Complete();
    }

    // Will the lock be still ON here? Because I don't need him to be!
}

ネストされたトランザクションまたはルートトランザクションを破棄した後、行/ページロック(UPDLOCK )が正確に解放されるのはいつですか?

4

1 に答える 1

2

ルート スコープが using ブロックを終了し、破棄された後にのみ解放されます。

この種のことを学ぶ最善の方法は、手を汚すことです。

テーブル A とテーブル B で単純なデータベースを作成します。それぞれに 1 つの列が含まれ、「TimeStamp」という名前を付け、タイムスタンプ (または任意の種類の値) を挿入する単純なコンソール アプリケーションを作成します。トランザクション オプションを操作して動作を学習できます。

于 2012-07-23T08:09:02.433 に答える