Tôi đã tìm thấy và bài viết trong MSDN Lbrary giải thích rằng try/catch không xử lý các lỗi được ném khi không thể tìm thấy đối tượng. SO, mặc dù tôi quấn một giao dịch trong một try/catch, cụm từ rollback sẽ không thực hiện:xử lý lỗi giao dịch khi đối tượng không tồn tại
BEGIN TRY
BEGIN TRANSACTION
SELECT 1 FROM dbo.TableDoesNotExists
PRINT ' Should not see this'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT
ERROR_MESSAGE()
END CATCH
--PRINT 'Error Number before go: ' + CAST(@@Error AS VARCHAR)
go
PRINT 'Error Count After go: ' + CAST(@@Error AS VARCHAR)
PRINT 'Transaction Count ' + CAST(@@TRANCOUNT AS VARCHAR)
cách khuyến khích để xử lý các lỗi ném là gì khi một đối tượng không tồn tại, đặc biệt là khi có một giao dịch liên quan đến . Tôi có nên tack mã bit này thay cho hai báo cáo in cuối cùng:
IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
PRINT 'Rolling back txn'
ROLLBACK TRANSACTION
END
go
PRINT 'Transaction Count again: ' + CAST(@@TRANCOUNT AS VARCHAR)
Đôi khi trong môi trường năng động, bạn không biết giản đồ chính xác ; một quá trình khác có thể thay đổi cấu trúc cơ sở dữ liệu, do đó, điều cần thiết là việc xử lý ngoại lệ try/catch bình thường sẽ hoạt động như bình thường. –
Điểm công bằng. Có, việc xử lý try/catch sẽ hoạt động chính xác nhưng tôi không bảo vệ MS; Tôi chỉ không đồng ý với việc sử dụng cơ sở dữ liệu này. – Tony
Tony, Kịch bản này xuất hiện trong môi trường thử nghiệm và phát triển của chúng tôi, nơi chúng tôi có nhiều nhà phát triển cùng làm việc trên những thay đổi mà họ đang thực hiện. Bây giờ đây là một tình huống mà tôi không thể kiểm soát được, vì vậy tôi không thể thay đổi nó. Tuy nhiên, vì các thay đổi có thể xảy ra với các đối tượng trong thử nghiệm, tôi cần có khả năng xử lý các lỗi được tạo ra từ các đối tượng bị thiếu và tôi nghĩ cơ chế try/catch sẽ có thể xử lý được. Vì nó không phải là tôi đang cố gắng tìm ra cách tốt nhất để sử dụng các giao dịch để những thay đổi mà tôi chịu trách nhiệm không kết thúc ở một trạng thái không nhất quán nào đó. – gr928x