Транзакция была заблокирована на ресурсах блокировки другим процессом и была выбрана в качестве взаимоблокировки

#sql #sql-server #transactions #sql-server-2014

#sql #sql-сервер #транзакции #sql-server-2014

Вопрос:

У меня есть следующая процедура для обновления моего бронирования и других связанных таблиц.

Но мы часто получаем ошибку

Transaction (Process ID 51) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

 CREATE PROCEDURE [dbo].[UpdateBookingDetails] (
     @ParmsList
    )
AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SET NOCOUNT ON

    BEGIN TRY
        BEGIN TRANSACTION UPDATEBOOKINGTRAN


            UPDATE Booking          

            SET @RecordsAffected = @@ROWCOUNT   

            INSERT INTO Payment 

            DELETE  FROM AdditionalBookingCategories

            INSERT AdditionalBookingCategories 

            DELETE FROM BookingAssistants

            INSERT INTO BookingAssistants 

            DELETE FROM BookingResource

            INSERT BookingResource 


        COMMIT TRANSACTION UPDATEBOOKINGTRAN
    END TRY

    BEGIN CATCH
        IF (@@TRANCOUNT > 0)
        BEGIN
            ROLLBACK TRANSACTION UPDATEBOOKINGTRAN

            PRINT 'Error detected, all changes reversed'
        END

        -- ERROR HANDLING - Grab Error code and throw  
        DECLARE @ErrorMessage NVARCHAR(4000)
            ,@ErrorProc NVARCHAR(126)
            ,@ErrorLineNo INT;

        SELECT @ErrorLineNo = ERROR_LINE()
            ,@ErrorMessage = ERROR_MESSAGE()
            ,@ErrorProc = ERROR_PROCEDURE();

        RAISERROR (
                'Error %s occurred in %s. Line  %d'
                ,16
                ,1
                ,@ErrorMessage
                ,@ErrorProc
                ,@ErrorLineNo
                )
        WITH SETERROR;
    END CATCH
END
  

Я не смог выяснить, в чем проблема с моей процедурой. Это выглядит нормально, но как появляется взаимоблокировка? Есть ли что-то, чего мне не хватает в моей процедуре для обработки взаимоблокировки?

Это случается редко, но по крайней мере 5 раз в день. Я не смог выполнить репликацию, поскольку для этого требуется одновременное обновление.

Комментарии:

1. Сколько записей было вставлено и удалено в каждой таблице?

2. Начните с просмотра графика взаимоблокировок