abbiamo un problema con TransactionScope. TransactionScope ci offre un'ottima flessibilità per utilizzare le transazioni attraverso il nostro Data Access Layer. In questo modo possiamo utilizzare le transazioni implicite o esplicite. Ci sono alcuni miglioramenti delle prestazioni ancora transazioni ADO.NET, ma in questo momento questo non è davvero un problema. Tuttavia abbiamo problemi con il blocco. Nel codice di esempio riportato di seguito, sebbene il livello di isolamento sia impostato su ReadCommitted, non è possibile effettuare l'istruzione Select SQL da altri client sulla tabella testTable, fino a quando non verrà eseguito il commit della transazione principale (nel metodo Main), poiché il blocco sull'intera tabella. Abbiamo anche provato a utilizzare una sola connessione tra tutti i metodi, ma lo stesso comportamento. Il nostro DBMS è SQL Server 2008. C'è qualcosa che non abbiamo capito?TransactionScope and Isolation Level
saluti Anton Kalcik
Vedi questo codice di esempio:
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();
}
}
}
Grazie per il vostro suggerimento. Quindi, se capito bene, le impostazioni del livello di isolamento della transazione su TransactionScope influenzeranno solo il modo in cui sarò in grado di accedere ai dati mediante l'operazione di lettura su DBMS da questo ambito di transazione. –