у нас есть проблема использования TransactionScope. TransactionScope обеспечивает нам очень хорошую гибкость при использовании транзакций через наш уровень доступа к данным. Таким образом, мы можем использовать транзакции неявные или явные. Есть некоторые повышения производительности снова ADO.NET транзакций, но в это время это не проблема. Однако у нас есть проблема с блокировкой. В приведенном ниже примере кода, хотя уровень изоляции установлен в ReadCommitted, сделать предложение Select SQL из другого клиента в таблице testTable невозможно, пока основная транзакция (в основном методе) не будет зафиксирована, поскольку на всей таблице есть блокировка. Мы также пытались использовать только одно соединение для всех методов, но такое же поведение. Наша СУБД - это SQL Server 2008. Есть ли что-то, чего мы не поняли?
Отношения Антон Кальчик
Смотрите этот пример кода:
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();
}
}
}