TransactionScope et niveau d'isolement

nous avons un problème pour utiliser TransactionScope. TransactionScope obtenir de nous une très bonne flexibilité pour l'utilisation de transactions à l'échelle de notre Couche d'Accès aux Données. Sur cette façon, nous pouvons utiliser les transactions implicites ou explicites. Il y a quelques boost de performance encore ADO.NET les transactions, mais en ce moment ce n'est pas vraiment le problème. Cependant, nous avons problème de verrouillage. Dans l'exemple de code ci-dessous, bien que le niveau d'isolation est défini à ReadCommitted, il n'est pas possible de Sélectionner instruction SQL à partir d'un autre client sur la table testTable, jusqu'à ce que l'opération principale (dans la méthode main) sera engagé, parce qu'il y a de verrouillage sur l'ensemble de la table. Nous avons également essayé d'utiliser une seule connexion à travers toutes les méthodes, mais même comportement. Notre SGBD SQL Server 2008. Est-il quelque chose de ce que nous n'avons pas compris?

Ce qui concerne
Anton Kalcik

Voir cet exemple de code:

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();
        }
    }
}

source d'informationauteur Anton Kalcik