TransactionScopeを使用する際に問題があります。 TransactionScopeは、データアクセスレイヤー全体でトランザクションを使用できる非常に優れた柔軟性を得ています。このようにして、暗黙的または明示的なトランザクションを使用できます。もう一度ADO.NETトランザクションのパフォーマンスが向上しますが、現時点ではこれは実際問題ではありません。しかし、私たちはロックに問題があります。下のサンプルコードでは、分離レベルはReadCommittedに設定されていますが、テーブル全体をロックしているため、(Mainメソッドの)メイントランザクションがコミットされるまで、testTableの他のクライアントからSelect SQLステートメントを作成することはできません。また、すべてのメソッドで1つの接続だけを使用しようとしましたが、同じ動作です。私たちのDBMSはSQL Server 2008です。私たちが理解できなかったことがありますか?TransactionScopeと分離レベル
よろしく アントンKalcik
このサンプルコードを参照してください:
class Program
{
public class DAL
{
private const string _connectionString = @"Data Source=localhost\fsdf;Initial Catalog=fasdfsa;Integrated Security=SSPI;";
private const string inserttStr = @"INSERT INTO dbo.testTable (test) VALUES(@test);";
/// <summary>
/// Execute command on DBMS.
/// </summary>
/// <param name="command">Command to execute.</param>
private void ExecuteNonQuery(IDbCommand command)
{
if (command == null)
throw new ArgumentNullException("Parameter 'command' can't be null!");
using (IDbConnection connection = new SqlConnection(_connectionString))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
}
}
public void FirstMethod()
{
IDbCommand command = new SqlCommand(inserttStr);
command.Parameters.Add(new SqlParameter("@test", "Hello1"));
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Required))
{
ExecuteNonQuery(command);
sc.Complete();
}
}
public void SecondMethod()
{
IDbCommand command = new SqlCommand(inserttStr);
command.Parameters.Add(new SqlParameter("@test", "Hello2"));
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Required))
{
ExecuteNonQuery(command);
sc.Complete();
}
}
}
static void Main(string[] args)
{
DAL dal = new DAL();
TransactionOptions tso = new TransactionOptions();
tso.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Required,tso))
{
dal.FirstMethod();
dal.SecondMethod();
sc.Complete();
}
}
}
あなたのヒントをありがとう。したがって、トランザクションスコープのトランザクション分離レベルの設定は、このトランザクションスコープからDBMSの読み取り操作によってデータにアクセスする方法にのみ影響します。 –