TransactionScope'u kullanmakta sorun yaşıyoruz. TransactionScope, Veri Erişim Katmanımızdaki işlemleri kullanmak için çok iyi bir esneklik sağlar. Bu şekilde, örtülü veya açık olan işlemleri kullanabiliriz. ADO.NET işlemlerinde tekrar bazı performans artışı var, ancak şu anda bu gerçekten sorun değil. Ancak kilitlemede sorun var. Örneğin, aşağıdaki kod, yalıtım düzeyi ReadCommitted olarak ayarlanmış olsa da, tüm tablo üzerinde kilit olduğu için ana işlem (Ana yöntemde) gerçekleştirilinceye kadar, diğer istemciden tablo sınaması için SelectTM deyimini yapmak mümkün değildir. Ayrıca, tüm yöntemlerde aynı bağlantıdan sadece bir bağlantı kullanmayı denedik. Bizim DBMS, SQL Server 2008'dir. Anlamadığımız bir şey var mı?TransactionScope ve Yalıtım Düzeyi
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();
}
}
}
İpucunuz için teşekkürler. Yani doğru anlaşılırsa, TransactionScope'taki işlem yalıtım seviyesinin ayarları sadece bu işlem kapsamından DBMS'de okuma işlemi ile verilere nasıl erişebileceğimi etkileyecektir. –