2011-01-13 22 views
8

Một thời gian trước, tôi đã viết một ứng dụng được nhiều người dùng sử dụng để xử lý việc tạo giao dịch. Tôi chưa thực hiện phát triển một thời gian và tôi không thể nhớ cách tôi quản lý sự tương tranh giữa những người dùng. Vì vậy, tôi đang tìm kiếm một số lời khuyên về thiết kế.Cách tốt nhất để quản lý sự tương tranh trong một ứng dụng truy cập cơ sở dữ liệu là gì?

Các ứng dụng ban đầu có các đặc điểm sau:

  • Một client nặng cho mỗi người dùng.
  • Một cơ sở dữ liệu duy nhất.
  • Truy cập cơ sở dữ liệu cho từng người dùng để chèn/cập nhật/xóa giao dịch.
  • Lưới trong ứng dụng phản ánh bảng giao dịch. Lưới đó đang được cập nhật mỗi lần ai đó thay đổi giao dịch.
  • Tôi đang sử dụng WPF.

Dưới đây là những gì tôi đang tự hỏi:

  1. Tôi thích hợp trong suy nghĩ rằng tôi không nên quan tâm đến các kết nối cơ sở dữ liệu cho mỗi ứng dụng? Xem xét rằng có một singleton trong mỗi, tôi sẽ mong đợi một kết nối cho mỗi khách hàng không có vấn đề.

  2. Tôi làm cách nào để ngăn chặn sự truy cập đồng thời của các truy cập? Tôi đoán tôi nên khóa khi sửa đổi dữ liệu, tuy nhiên không nhớ làm thế nào để.

  3. Làm cách nào để thiết lập lưới để tự động cập nhật bất cứ khi nào cơ sở dữ liệu của tôi được cập nhật (bởi một người dùng khác chẳng hạn)?

Cảm ơn bạn đã trợ giúp!

+3

gì loại cơ sở dữ liệu? –

+0

Bạn đang sử dụng làm giao diện người dùng? ASP.NET? WinForms? WPF? Silverlight? – Jeff

+0

Tôi đang sử dụng WPF. Tôi đã thêm nó vào phần mô tả. cảm ơn – Goul

Trả lời

2
  1. Cân nhắc tận dụng Kết nối tổng hợp để giảm số lượng kết nối. Xem: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  2. khóa càng sớm càng tốt và phát hành càng sớm càng tốt để tối đa hóa đồng thời. Bạn có thể sử dụng TransactionScope (xem: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspxhttp://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx) nếu bạn có nhiều hành động db cần phải đi cùng nhau để quản lý tính nhất quán hoặc chỉ xử lý chúng trong DB được lưu trữ proc. Giữ truy vấn của bạn đơn giản. Thực hiện theo những lời khuyên sau đây để hiểu cách khóa công việc và làm thế nào để giảm bớt tranh chấp tài nguyên và bế tắc: http://www.devx.com/gethelpon/10MinuteSolution/16488

  3. Tôi không chắc chắn db khác, nhưng đối với SQL, bạn có thể sử dụng SQL phụ thuộc, xem http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

+0

Cảm ơn câu trả lời Jimmy! Nó cho tôi một số ánh sáng trên tất cả các câu hỏi của tôi, cảm ơn cho các bài báo. – Goul

3

Đồng thời thường được cấp bởi DBMS bằng cách sử dụng khóa. Khóa là một loại semaphore cấp khóa độc quyền cho một tài nguyên nhất định và cho phép các truy cập khác bị hạn chế hoặc xếp hàng đợi (chỉ bị giới hạn trong trường hợp bạn sử dụng các lần đọc không phổ biến).

Số lượng kết nối không gây ra vấn đề trong khi bạn không đạt đến độ cao nơi bạn có thể chạm vào cài đặt max_connections của DBMS của mình. Nếu không, bạn có thể gặp sự cố khi kết nối với nó vì mục đích bảo trì hoặc tắt nó.

DBMS thường sử dụng khái niệm về khóa bảng (MyISAM) hoặc khóa hàng (InnoDB, hầu hết các DBMS khác). Loại khóa xác định âm lượng của khóa. Khóa bảng có thể rất nhanh nhưng thường được coi là kém hơn so với khóa mức hàng.

Khóa mức hàng xảy ra bên trong giao dịch (ẩn hoặc rõ ràng). Khi bắt đầu giao dịch theo cách thủ công, bạn bắt đầu phạm vi giao dịch của mình. Cho đến khi bạn đóng thủ công phạm vi giao dịch, tất cả thay đổi bạn thực hiện sẽ là thuộc tính cho giao dịch chính xác này. Những thay đổi bạn thực hiện cũng sẽ tuân theo ACID paradigm.

Phạm vi giao dịch và cách sử dụng nó là một chủ đề quá dài cho nền tảng này, nếu bạn muốn, tôi có thể đăng một số liên kết mang nhiều thông tin hơn về chủ đề này.

Đối với các bản cập nhật tự động, hầu hết các cơ sở dữ liệu hỗ trợ một số loại cơ chế kích hoạt, là mã chạy ở các hành động cụ thể trên cơ sở dữ liệu (ví dụ: tạo bản ghi mới hoặc thay đổi bản ghi).Bạn có thể đăng mã của mình bên trong trình kích hoạt này. Tuy nhiên, bạn chỉ nên thông báo cho ứng dụng nhận các thay đổi, không thực sự "thực hiện" các thay đổi từ trình kích hoạt, ngay cả khi ngôn ngữ có thể làm cho nó có thể. Hãy nhớ rằng hành động kích hoạt mã bị tạm ngưng cho đến khi bạn kết thúc bằng mã kích hoạt của mình. Điều này có nghĩa là một kích hoạt nạc là tốt nhất, nếu nó là cần thiết ở tất cả.

+0

Cảm ơn sự giúp đỡ của bạn TME, nó rất hữu ích và trả lời tôi tốt các cơ chế đồng thời. Chúc mừng – Goul

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