chúng tôi gặp sự cố khi sử dụng TransactionScope. TransactionScope cho phép chúng tôi linh hoạt rất tốt để sử dụng các giao dịch trên Lớp Truy cập Dữ liệu của chúng tôi. Bằng cách này, chúng ta có thể sử dụng các giao dịch ngầm hoặc rõ ràng. Có một số tăng hiệu suất một lần nữa các giao dịch ADO.NET, nhưng tại thời điểm này điều này không thực sự là vấn đề. Tuy nhiên chúng tôi có vấn đề với khóa. Trong mã ví dụ dưới đây, mặc dù mức cô lập được đặt thành ReadCommitted, nhưng không thể tạo câu lệnh Select SQL từ máy khách khác trên bảng testTable, cho đến khi giao dịch chính (trong phương thức chính) sẽ được thực hiện bởi vì có khóa trên toàn bộ bảng. Chúng tôi cũng đã cố gắng chỉ sử dụng một kết nối trên tất cả các phương pháp, nhưng hành vi tương tự. DBMS của chúng tôi là SQL Server 2008. Có điều gì chúng tôi không hiểu không?Cấp độ giao dịch và cách ly
Trân Anton Kalcik
Xem mẫu này mã:
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();
}
}
}
Cảm ơn bạn đã gợi ý. Vì vậy, nếu hiểu đúng, các thiết lập mức cô lập giao dịch tại TransactionScope sẽ chỉ ảnh hưởng đến cách tôi có thể truy cập dữ liệu bằng cách đọc hoạt động trên DBMS từ phạm vi giao dịch này. –