Buộc hết thời gian chờ truy vấn trong SQL Server


79

Chúng tôi đã gặp sự cố với một khối mã phản hồi kém khi đối mặt với cơ sở dữ liệu chậm (Nó nhồi nhét hết thời gian chờ truy vấn). Chúng tôi đã tạo một bản vá và đang trong quá trình chạy nó thông qua hồi quy.

Chúng tôi không thể hết thời gian chờ. Tôi đã mở một giao dịch từ SQL Mgmt Studio và cập nhật mọi hàng để khóa chúng, nhưng điều đó không khiến INSERTs hết thời gian chờ (đó là những gì tôi cần).

Tôi có thể dễ dàng nhận được khóa cấp bảng thông qua T-SQL không? Hay tôi phải loanh quanh trong chủ? Hay tôi có thể dễ dàng buộc thời gian chờ mà không cần khóa? Bất kỳ đầu vào nào được đánh giá cao.

Câu trả lời:


131

chạy cái này và sau đó thử chèn của bạn ...

select * from yourTable with (holdlock,tablockx)

tại đây, bạn có thể khóa nó trong 5 phút:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

Có cách nào để thực hiện việc này từ C # /. NET mà không chặn luồng đã thực hiện cuộc gọi này đến SQL Server không? Tôi đang cố gắng kiểm tra hành vi của ứng dụng khi có kết nối hết thời gian chờ. Nhưng nếu tôi gọi mã này từ C #, tôi không biết làm thế nào để chạy một truy vấn khác, có mục đích gặp phải thời gian chờ.
Jake Smith

33

Bạn chỉ cần cho mã sql của mình đợi một phút trước khi quay lại:

WaitFor Delay '00:01:00'

Đã bình chọn cho sự đơn giản của câu trả lời. Tôi đã thử nghiệm nó và nó hoạt động
Mikel

Tôi đang điền vào một bảng và tạo ra các truy vấn đệ quy phức tạp, buff, vô nghĩa. Đây là thủ thuật.
DanielV

10

Mặt khác: Nếu kết nối có thể định cấu hình, hãy giảm thời gian chờ của chuỗi kết nối xuống còn 1 giây - điều đó sẽ giúp bạn dễ dàng hơn. Điền vào bảng với vô số dữ liệu và có 3 quy trình khác quay trong một vòng lặp cập nhật các phần của bảng đó với một giao dịch xung quanh vòng lặp. Không thay đổi quy trình thực tế được gọi bởi ứng dụng (tiêm chờ đợi). Điều đó làm mất hiệu lực kiểm tra tích hợp.

Nhưng thực sự, đây là một nghiên cứu điển hình thiên về thử nghiệm đơn vị và tiêm phụ thuộc. Một số điều chỉ là khó để kiểm tra tích hợp. Kiểm tra đơn vị + tiêm phụ thuộc .

  • Real: Mã bị lỗi -> Cơ sở dữ liệu hết thời gian chờ (khó tái tạo).
  • Refactor: Mã nhồi nhét -> Kho lưu trữ (chỉ truy cập dữ liệu) -> Cơ sở dữ liệu
  • Unit test: Code mà craps> Mock repository để ném -> null
  • Bây giờ bạn có một bài kiểm tra thất bại cho mã craps và có thể khắc phục nó.

Đây là tiêm "phụ thuộc". Nhà phát triển có thể đưa phần phụ thuộc vào cơ sở dữ liệu, thay thế thứ gì đó mô phỏng hành vi của phần phụ thuộc. Tốt để làm cho tất cả các bài kiểm tra cơ sở dữ liệu. Dù sao, với thử nghiệm đơn vị tại chỗ, bạn biết bản sửa lỗi thực hiện những gì nó nên, nhưng bạn vẫn cần thử nghiệm tích hợp. Trong trường hợp này, tốt hơn nên tập trung vào hồi quy - có nghĩa là thử nghiệm nó không phá vỡ bất kỳ điều gì khác và tính năng vẫn hoạt động.

Bạn đã tạo bản vá của mình, vì vậy tôi đoán câu trả lời của tôi là quá muộn.


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.