#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. Начните с просмотра графика взаимоблокировок