2012-06-25 31 views
5

tôi chỉ kiểm tra PetaPoco giao dịch một cách multithread ...PetaPoco giao dịch trong thời nhiều Env

Tôi có một trường hợp thử nghiệm đơn giản:

- đối tượng giá trị đơn giản gọi nó là MediaDevice - Chèn một một kỷ lục cập nhật nó cho 1000 lần

void TransactionThread(Object object) 
{ 


    Database db = (Database) object; 

    for(int i= 0; i < 1000;i++) 
    { 


     Transaction transaction = db.GetTransaction(); 

     MediaDevice device = new MediaDevice(); 
     device.Name = "Name"; 
     device.Brand = "Brand"; 

     db.Insert(device); 

     device.Name = "Name_Updated"; 
     device.Brand = "Brand_Updated"; 


     db.Update(device); 

     transaction.Complete(); 

    } 


    long count = db.ExecuteScalar<long>("SELECT Count(*) FROM MediaDevices"); 

    Console.WriteLine("Number of all records:" + count); 

} 

Và tôi gọi đây là hai chủ đề như thế này: [Độc Cơ sở dữ liệu đối tượng cho cả chủ đề]

void TransactionTest() 
{ 

    Database db = GetDatabase(); 

    Thread tThread1 = ... // thread for TransactionTest() 

    Thread tThread2 = ... // thread for TransactionTest() 

    tThread1.Start(db); // pass Database to TransactionTest() 
    tThread2.Start(db); // pass same Database to TransactionTest() 

} 

tôi nhận được lỗi Null hoặc đôi khi Object lỗi thanh lý khoản cho cơ sở dữ liệu ..

Nhưng khi tôi cung cấp hai ví dụ cơ sở dữ liệu,

void TransactionTest() 
{ 

    Database db = GetDatabase(); 
    Database db2 = GetDatabase(); 

    Thread tThread1 = ... // thread for TransactionTest() 

    Thread tThread2 = ... // thread for TransactionTest() 


    tThread1.Start(db); // pass Database instance db to TransactionTest() 
    tThread2.Start(db2); // pass Database intance db2 to TransactionTest() 

} 

everthing là OK ...

Vâng Khi tôi kiểm tra PetaPoco mã nguồn tại giao dịch tôi thấy rằng tại transaction.Complete

public virtual void Complete() 
     { 
      _db.CompleteTransaction(); 
      _db = null; 
     } 

Câu hỏi của tôi là để có thể sử dụng giao dịch từ nhiều chủ đề Tôi có phải sử dụng bản sao mới của đối tượng Cơ sở dữ liệu không? Hay tôi đang làm gì sai?

Và để làm cho chuỗi này an toàn, tôi có phải mở và đóng cơ sở dữ liệu MỚI ở mọi truy vấn cập nhật dữ liệu không?

Trả lời

1

Hi sử dụng với nolock trong truy vấn chọn vì bảng có thể bị khóa. long count = db.ExecuteScalar ("Đếm SELECT (*) với Nolock FROM MediaDevices");

+0

Tôi không nhận được ngoại lệ tại tuyên bố này ... db.ExecuteScalar (...) – Novalis

1

xin lỗi dude .. có bạn đã đúng. chúng thay đổi đối tượng thành rỗng. vì vậy bạn không thể sử dụng cùng một đối tượng để phân luồng. bạn phải sử dụng chúng sử dụng mô tả như db = GetDataBase(); db2 = GetDataBase();

nếu không bạn có thể thay đổi mã nguồn cho yêu cầu của mình. tôi nghĩ rằng giấy phép của họ cho phép nó. nhưng tôi không chắc chắn.

4

Có, bạn cần một cá thể PetaPoco Database riêng cho mỗi luồng. Xem trích dẫn này từ tài liệu của PetaPoco:

Lưu ý: để giao dịch hoạt động, mọi hoạt động cần sử dụng cùng một đối tượng cơ sở dữ liệu PetaPoco. Vì vậy, có thể bạn sẽ muốn sử dụng yêu cầu cho mỗi http hoặc vùng chứa IOC cho mỗi luồng để phân phát phiên bản được chia sẻ của đối tượng này. Cấu trúc cá nhân Bản đồ của tôi là yêu thích cho việc này.

Tôi in đậm cụm từ cung cấp đầu mối. Nó nói rằng một thể hiện của đối tượng cơ sở dữ liệu PetaPoco nên được sử dụng cho mỗi luồng.

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