2

(ロックを変更するために) TransactionScope にラップされた LINQ select ステートメントを使用していますが、SQL プロファイラーによると、機能していないようです。私のコードは次のようになります:

using (var ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted} ))
{
   using (myDBDataContext dbPKC = new myDBDataContext(conn))
   {
      ...query...
      ts.Complete();
      return xmlMachine;
   }
}

ここで、SQL プロファイラーが select ステートメントに対して BatchStarting と BatchComplete を表示することを期待します。しかし、RPC:Completed と表示されます。なんで?このコードを実行すると:

using (SqlConnection conn1 = new SqlConnection())
    {
      conn1.ConnectionString = WebConfigurationManager.ConnectionStrings["myConnectionString"].ToString(); ;
      conn1.Open();
      using (SqlTransaction trans1 = conn1.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
      {
        SqlCommand cmd = new SqlCommand("select * from Machines where pkID = 5");
        cmd.Connection = conn1;
        cmd.Transaction = trans1;
        SqlDataReader reader = cmd.ExecuteReader(); // just execute something
      }
    }

BatchStarting と BatchComplete が表示されます。LINQ が TransactionScope を「認識」していないように見えるのはなぜですか?

また、Profiler を使用して分離レベルが正しいことを確認する方法はありますか? 最初の接続の分離レベルは、Audit Login でしか確認できません。変更されたこと、または各クエリが使用している各分離レベルを示す「更新」は表示されません。

どんな助けでも素晴らしいでしょう!

また、このコードは、SQL Server 2008 に接続する WCF (3.5) サービスで実行されています。

4

1 に答える 1

1

更新しました:

分離レベルを確認するには、次のようなことを試してください。

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options))
{
    //Verify Scope using DBCC USEROPTIONS
    SqlCommand cmd = (SqlCommand)ctxt.Connection.CreateCommand();
    cmd.CommandText = "DBCC USEROPTIONS";
    SqlDataReader r = cmd.ExecuteReader();
    while (r.Read())
    {
        Console.WriteLine(r.GetValue(0) + ":" + r.GetValue(1));
    }
}   

追加した:

探すSET TRANSACTION ISOLATION LEVEL

于 2010-09-02T19:39:05.170 に答える