2012-11-01 24 views
8

Tôi đã kế thừa một hệ thống được xây dựng trên cơ sở dữ liệu MySQL sử dụng các bảng InnoDB. Hệ thống có lỗi hiển thị dưới tải nặng. Tôi đã tạo ra một số thử nghiệm jmeter để tải lên hệ thống hy vọng sẽ nhìn thấy lỗi trong một môi trường được kiểm soát. Tuy nhiên, tôi không nhấn mạnh hệ thống một cách chính xác và lỗi không bao giờ hiển thị. Lý thuyết hiện tại là các bảng bị khóa nặng đang gây ra một sự khôi phục, để lại dữ liệu của người dùng ở trạng thái lẻ. Điều này có thể có nghĩa là các giao dịch không được cấu trúc đúng và tôi muốn tìm và khắc phục điều đó, nhưng trước tiên tôi cần phải tìm ra vấn đề.Mô phỏng các vấn đề về khóa bảng

Tôi phỏng đoán rằng nếu tôi có thể tạo nhiều khóa "bảng khóa" khác nhau trong cơ sở dữ liệu, tôi có thể chạy người dùng mô phỏng trên toàn bộ hệ thống và buộc lỗi xảy ra hoặc chứng minh lý thuyết sai, nhưng tôi không chắc chắn làm thế nào để tạo ra một điều như vậy. Có ai có một ý tưởng về cách tốt nhất để làm điều này? Tại thời điểm này tôi thậm chí không chắc chắn những gì một phiên bản đầu tiên nghèo sẽ như thế nào, vì vậy bất kỳ ý tưởng để giúp tôi bắt đầu sẽ giúp đỡ. Cảm ơn!

+0

Cho đến nay, tôi đã tạo ra một "kiểm tra" jmeter mà thực hiện một SELECT ... FOR UPDATE và sau đó cập nhật hàng quan tâm trong bảng nghi ngờ. Tôi đã không thể tái tạo các lỗi cho đến nay, nhưng đây là cách tiếp cận duy nhất tôi đã có thể đến với điều đó có vẻ hợp lý. –

Trả lời

5

Nếu bạn đang tìm kiếm trạng thái bị khóa cho một hàng trong một bảng (tôi cho rằng đây là ý của bạn trừ khi bạn đang thực hiện thay đổi cho chính bảng đó). Bạn có thể thực hiện điều này bằng cách có một tập lệnh thứ hai bắt đầu một giao dịch trên một tập hợp các hàng và sau đó tạm dừng một khoảng thời gian trước khi quay lại hoặc thực hiện giao dịch.

phép nói rằng bạn có cấu trúc này bảng ví dụ:

CREATE TABLE `allkindsofvalues` (
    `value1` int(11) NOT NULL, 
    `value2` int(11) NOT NULL, 
    `irrelevant_value3` int(11) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Mở ra một cửa sổ và bắt đầu MySQL giao dịch:

BEGIN; 

UPDATE allkindsofvalues SET irrelevant_value3 = '32143234232'; 

Bây giờ bắn lên ứng dụng của bạn. Tại thời điểm này, mọi nỗ lực để sử dụng các hàng này sẽ chờ giao dịch bắt đầu hoàn tất.

Thời điểm bạn COMMIT hoặc ROLLBACK giao dịch trong dấu nhắc MySQL, mọi thứ sẽ tiếp tục bình thường, nhưng cho đến thời điểm đó các hàng sẽ ở trạng thái bị khóa, không thể truy cập. Có vẻ như điều kiện bạn đang cố gắng sao chép.

+0

Cảm ơn, Shane, nghe có vẻ như nó có thể làm điều đó, tôi sẽ thiết lập nó và thử nó. Có cách nào để theo dõi những gì bị khóa và thời gian bị khóa không? Tôi đã đăng nhập các truy vấn với hy vọng phát hiện lỗi của mình, nhưng điều đó dường như không đủ thông tin để cô lập vấn đề và có rất nhiều truy vấn. –

+0

Điều đó hoạt động rất tốt và có vẻ như một cách tuyệt vời để tìm mã giòn, vì vậy tôi đã chấp nhận câu trả lời. Tôi sẽ giải thích về điều này và xem liệu tôi có thể tạo ra một số xét nghiệm jmeter để mô phỏng một cái gì đó gần hơn với một tình huống thực tế nơi khóa xảy ra thường xuyên nhưng không liên tục. Cảm ơn! –

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