Từ mã dưới đây, chúng tôi nhận được ngoại lệ tại raiseerror - Giao dịch hiện tại không thể được cam kết và không thể hỗ trợ các hoạt động ghi vào tệp nhật ký. Quay trở lại giao dịch.Giao dịch hiện tại không thể được cam kết và không thể hỗ trợ các thao tác ghi vào tệp nhật ký. Quay trở lại giao dịch
IF @insertOrUdate = 'D'
BEGIN
-- DescType depends on CorrectionType and is also a protected sync table,
-- it needs to be cleared out before we can remove this type
IF EXISTS(
SELECT TOP 1 *
FROM [dbo].[DescType]
WHERE
[CorrectionTypeId] = @correctionTypeId
)
BEGIN
PRINT 'raise error'
RAISERROR('Dependent Desc Role Type Rollups must be removed prior to removing a type that they depend on', 16, 1)
PRINT 'after raise error'
END
-- Delete protected Sync record
DELETE FROM [dbo].[CorrectionType] WHERE [CorrectionTypeId] = @correctionTypeId;
END;
Đoạn mã trên có trong giao dịch và/hoặc trong khối TRY..CATCH không? Cài đặt XACT_ABORT tại thời điểm đoạn mã này sẽ được chạy là gì? Ngoài ra, có một kích hoạt trên dbo.CorrectionType? –
mã này được gọi từ một proc khác, đã bắt đầu và giao dịch. XACT_ABORT đã bật. có kích hoạt tồn tại, tuy nhiên tại beginnig chúng tôi đang vô hiệu hóa các kích hoạt và cho phép họ trở lại ở cuối. Đây là mã hoàn chỉnh để bạn tham khảo: –
Nếu bạn đang thực hiện lệnh 'EXISTS()', bạn không nên làm bất cứ điều gì buồn cười với truy vấn như 'TOP 1' hoặc' ORDER BY' - tất cả những gì bạn làm là làm xáo trộn truy vấn và có thể khiến trình tối ưu hóa làm điều gì đó ngu ngốc (chẳng hạn như thực hiện toàn bộ tập kết quả). 'EXISTS()' của chính nó là đủ thông minh để thoát ra khi nó được nhìn thấy một hàng kết quả duy nhất. –