2011-07-09 35 views
11

tôi cần phải làm một cái gì đó như thế này trên một bối cảnh giao dịchTransactionScope, nơi bắt đầu giao dịch trên hồ sơ sql?

using(var context = new Ctx()) 
{ 

using (TransactionScope tran = new TransactionScope()) 
{ 
    decimal debit = 10M; 
    int id = 1; 

    var data = context.Cashier 
     .Where(w => w.ID == id) 
     .Select(s => new{ s.Money }) 
     .Single(); 


    Cashier cashier = new Cashier(){ ID = id }; 
    context.Cashier.Attach(cashier); 

    cashier.Money = data.Money - debit; 
    context.Entry(cashier).Property(p => p.Money).IsModified = true; 

    context.SaveChanges(SaveOptions.None); 
    tran.Complete(); 
} 
} 

Tôi đang chạy SQL Profiler nhưng không thể nhìn thấy bắt đầu tran, là khối mã có đúng không? Tui bỏ lỡ điều gì vậy?

+2

Có thể bạn đã lọc ra? Bạn cũng có thể thử tạo ra ctx bên trong giao dịch, chỉ để xem tôi có thay đổi gì không. –

+0

Tại sao bạn sử dụng phạm vi giao dịch cho khối mã này? 'SaveChanges' sử dụng giao dịch nội bộ nếu bạn không xác định nó, trừ khi bạn đang sử dụng nhiều tài nguyên giao dịch hoặc gọi' SaveChanges' nhiều lần bạn không cần nó. –

+0

Ladislav, đó là để ngăn chặn dữ liệu sai, người khác có thể sửa đổi tiền thu ngân trên phương pháp khác, nếu nó không giao dịch, thông tin này sẽ sai – Alexandre

Trả lời

19

Giống như @Marc cho biết trong nhận xét của mình, các tin nhắn có thể đang được lọc ra. Bạn sẽ chỉ nhận các thông điệp giao dịch T-SQL trong cấu hình mặc định, chứ không phải các thông điệp giao dịch được gửi trực tiếp bằng API (như TransactionScope).

Trong SQL Server Profiler, hãy chuyển đến lựa chọn sự kiện theo dõi và chọn hộp kiểm "Hiển thị tất cả sự kiện". Xuống ở dưới cùng là danh mục "Giao dịch" và nó sẽ cung cấp cho bạn những gì bạn cần. Cụ thể, các sự kiện bắt đầu bằng TM:.

+0

đó là Adam! tks – Alexandre

Các vấn đề liên quan