nous avons un problème à utiliser TransactionScope. TransactionScope nous offre une très bonne flexibilité pour utiliser les transactions sur notre couche d'accès aux données. De cette façon, nous pouvons utiliser des transactions implicites ou explicites. Il y a encore une amélioration des performances des transactions ADO.NET, mais pour le moment ce n'est pas vraiment un problème. Cependant nous avons un problème avec le verrouillage. Dans l'exemple de code ci-dessous, bien que le niveau d'isolement soit défini sur ReadCommitted, il est impossible de faire une instruction Select SQL depuis un autre client sur la table testTable, jusqu'à ce que la transaction principale (dans la méthode Main) soit validée. Nous avons également essayé d'utiliser une seule connexion pour toutes les méthodes, mais le même comportement. Notre SGBD est SQL Server 2008. Y at-il quelque chose que nous n'avons pas compris?TransactionScope et niveau d'isolement
Cordialement 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();
}
}
}
Merci pour votre indice. Donc, si cela est bien compris, les paramètres du niveau d'isolation des transactions sur TransactionScope n'affecteront que la façon dont je pourrai accéder aux données par opération de lecture sur le SGBD à partir de cette portée de transaction. –