Làm thế nào để bạn kiểm tra các điều kiện cuộc đua trong cơ sở dữ liệu?


30

Tôi cố gắng viết mã cơ sở dữ liệu để đảm bảo rằng nó không phải tuân theo các điều kiện chủng tộc, để đảm bảo rằng tôi đã khóa các hàng hoặc bảng chính xác. Nhưng tôi thường tự hỏi: mã của tôi có đúng không? Có thể buộc bất kỳ điều kiện chủng tộc hiện có để hiển thị? Tôi muốn chắc chắn rằng nếu chúng xảy ra trong môi trường sản xuất, ứng dụng của tôi sẽ làm đúng.

Tôi thường biết chính xác truy vấn đồng thời nào có thể gây ra sự cố, nhưng tôi không biết làm cách nào để buộc họ chạy đồng thời để xem liệu hành vi đúng có xảy ra không (ví dụ: tôi đã sử dụng đúng loại khóa), rằng đó là lỗi đúng ném, v.v.

Lưu ý: Tôi sử dụng PostgreSQL và Perl, vì vậy nếu điều này không thể được trả lời một cách khái quát thì có lẽ nó sẽ được thử lại như vậy.

Cập nhật: Tôi thích nó hơn nếu giải pháp là lập trình. Bằng cách đó tôi có thể viết các bài kiểm tra tự động để đảm bảo không có hồi quy.


"Điều kiện chủng tộc" có nghĩa là "bế tắc"?
Gaius

2
@Gaius ... mặc dù tôi tin rằng đó là một kết quả có thể có của một số điều kiện chủng tộc
xenoterracide

Điều kiện cuộc đua @Gaius trong cơ sở dữ liệu sẽ làm những việc như bỏ bảng trước khi nó được tạo hoặc cập nhật một hàng trước khi nó được chèn. Nói chung tôi sẽ tưởng tượng rằng nó được xử lý bởi logic ứng dụng bên ngoài cơ sở dữ liệu.
Đánh dấu

cập nhật một hàng trước khi nó được chèn vào? Điều đó sẽ không gây ra vấn đề db. không có điều kiện cuộc đua nào giống như tìm nạp một hàng và cập nhật nó, nhưng có một người dùng khác cập nhật nó sau khi hàng của bạn được tìm nạp nhưng trước khi cập nhật của bạn được xử lý.
xenoterracide

1
@MarkD - Không. Có nhiều loại điều kiện chủng tộc phát sinh từ việc đóng gói không chính xác một đơn vị công việc nguyên tử trong cơ sở dữ liệu của bạn. Đây là một ví dụ. Hãy nhớ rằng, "một điều kiện chủng tộc hoặc nguy cơ chủng tộc là một lỗ hổng trong hệ thống điện tử hoặc quy trình, theo đó đầu ra hoặc kết quả của quá trình phụ thuộc bất ngờ và cực kỳ phụ thuộc vào chuỗi hoặc thời gian của các sự kiện khác ." ( nguồn )
Nick Chammas

Câu trả lời:


11

Tôi làm điều đó mọi lúc với các mô-đun T-SQL của mình.

Về cơ bản, tất cả những gì bạn cần làm là chạy các mô-đun của mình từ hai hoặc nhiều kết nối trong một vòng lặp trong vài phút . Thông thường, tất cả các vấn đề tiềm ẩn sẽ được phơi bày trong vài phút, giả sử bạn có hộp SQL Server với CPU tốt.

Tôi đã viết một vài ví dụ ở đâyở đây .


4

Tôi thường làm việc với công cụ dòng lệnh của RDBMS, chỉ cần có 2 (hoặc nhiều) phiên bản CLI bắt đầu. Sau đó, bạn có thể phát lại từng cái một và như một cuộc đua (trông giống như một game nhập vai hành động), câu lệnh SQL mà lớp ứng dụng của bạn đang gửi. Bạn nên thử nghiệm / cảm nhận các hệ thống khóa hoạt động vì CLI của bạn sẽ "treo" một chút, chờ khóa được giải phóng khỏi CLI khác.

Nếu điều này nghe có vẻ rõ ràng như bùn, đừng ngần ngại nói như vậy ;-)


bạn có thể đưa ra một ví dụ từng bước? và các bài kiểm tra lập trình có thể được viết để làm điều tương tự không?
xenoterracide

1

Điều kiện cuộc đua yêu cầu nhiều luồng thực hiện, do đó để kiểm tra đơn vị này, bạn sẽ cần có thể bắt đầu một hoặc nhiều luồng. Trong Oracle tôi sẽ sử dụng DBMS_Scheduler để chạy một quy trình để mô phỏng người dùng thứ hai. Nếu PostgreSQL / Perl có cách để bắt đầu một quy trình thứ hai theo chương trình, thì bạn sẽ có thể làm một cái gì đó như thế này:

Quy trình 1 Quy trình 2

Bắt đầu quá trình 2. >>                            
Trì hoãn để cho phép 2 làm việc đó. 
. Khóa hàng hoặc thay đổi dữ liệu.
. Trì hoãn để cho phép 1 để làm việc đó.
Cố gắng khóa hàng hoặc thay đổi dữ liệu. .
Kiểm tra để đảm bảo xử lý thích hợp được thực hiện. .
Kết thúc. .
                                                Kết thúc.

Thật tốt khi thấy suy nghĩ về cách xử lý các điều kiện chủng tộc và quan trọng hơn là làm thế nào để kiểm tra chúng.


Tôi sẽ không mô tả các bài kiểm tra như bài kiểm tra đơn vị, bởi vì bài kiểm tra đơn vị phải chạy chính xác theo cùng một cách mỗi lần. Điều kiện cuộc đua thất bại liên quan đến các quá trình không liên tục, không hoàn toàn giống nhau mọi lúc.
AK

@AlexKuznetsov Bạn đã đúng rằng các điều kiện cuộc đua bất ngờ có thể hiển thị chúng không liên tục, tuy nhiên OP đang đề cập đến các điều kiện Dự kiến mà anh ấy tin rằng mã sẽ được xử lý. Những điều kiện cụ thể này có thể được sao chép chính xác và việc xử lý được xác minh bằng một bài kiểm tra đơn vị.
Leigh Riffel

-2

Miễn là bạn khóa các hàng, bạn không nên tham gia vào cuộc đua vì điều đó thường xảy ra khi không có khóa.

Nhưng bạn có thể bị bế tắc nếu một câu hỏi chặn câu hỏi của bạn quá lâu.

Điều này khó kiểm tra vì thời gian cho các truy vấn có thể thay đổi khi cơ sở dữ liệu phát triển.

Các truy vấn hoạt động tốt với 100 000 hàng dữ liệu thử nghiệm sẽ tắt khỏi biểu đồ với 10 000 000 hàng.

Loại vấn đề này có thể rất khó tìm thấy trước, nhưng nhiều DB có một số phương pháp xác định các truy vấn chậm.

Bằng cách sử dụng quy định đó, bạn sẽ có thể bẫy bất kỳ truy vấn nào đang gặp rắc rối với cảnh báo rộng rãi.

Nếu bạn tự khóa, một câu chuyện khác, nhưng tôi không thể giúp được.


@darioo lol Tôi nghĩ có lẽ wn là từ viết tắt của một cái gì đó ... idk ý anh ấy là gì khi "tự khóa" Nếu anh ấy có nghĩa là không phải với ORM, tôi đã kiểm tra mã ORM của mình, nó chắc chắn không làm khóa phải. Đó là một trong những lý do tôi muốn có thể kiểm tra kịch bản điều kiện cuộc đua tiềm năng.
xenoterracide

Có, ý tôi là, và thông thường trình điều khiển cơ sở dữ liệu xử lý khóa, hàng, bảng hoặc có thể là trường, nhưng tôi chỉ mở ra khả năng bạn sử dụng một số DB không xử lý khóa;)

.. Tôi khá chắc chắn nếu tôi có một giao dịch nhiều câu lệnh mà DB của tôi sẽ không biết hàng nào sẽ tự động khóa ... những thứ như select for updatesẽ không tồn tại nếu chúng thực hiện ...
xenoterracide
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.