2015-11-03 3 views
4

Я работаю над панелью ввода данных, там работает более 300 клиентов с обновлением данных в таблице данных, я использую хранимую процедуру для выполнения обновления в таблице данных, выглядит следующим образом:Тупик в обновленной хранимой процедуре

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:    <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description:  <Description,,> 
-- ============================================= 
ALTER PROCEDURE [dbo].[Update_Tbl_Client_Bpo_Data] 

@Id int, 
@CId varchar(50), 
@Tbc_No varchar(200), 
@Name varchar(200), 
@EmailId varchar(200), 
@MobileNo varchar(50), 
@Gender varchar(50), 
@LicenseNo varchar(200), 
@GirNo varchar(200), 
@PanNo varchar(200), 
@H_Address varchar(500), 
@H_City varchar(200), 
@H_PinNo varchar(200), 
@H_county varchar(200), 
@H_State varchar(200), 
@O_Address varchar(200), 
@O_City varchar(200), 
@O_PinNo varchar(200), 
@LAL varchar(200), 
@MRNNo varchar(200), 
@AF varchar(200), 
@NRI varchar(200), 
@CP varchar(200), 
@Status varchar(200) 

AS 
BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 



     update Tbl_Client_Bpo_Data 
set 

[email protected]_No, 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected]_Address, 
[email protected]_City, 
[email protected]_PinNo, 
[email protected]_county, 
[email protected]_State, 
[email protected]_Address, 
[email protected]_City, 
[email protected]_PinNo, 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected] from Tbl_Client_Bpo_Data where [email protected] and [email protected] 
END 

эта хранимая процедура получения Deadlock ошибки, как это ...

transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. rerun the transaction. 

я создать модуль резервного копирования, чтобы найти журналы ошибок, который показывает, что эта хранимая процедура получения взаимоблокировки при больше клиентов также попытаться обновить данные. . Error Logs

я также добавил SET TRANSACTION ISOLATION LEVEL READ COMMITTED

, но он не работает для меня .. может кто-то дать решение разрешить эту ситуацию ..

или если есть какой-то механизм, который держит исполнение процесс до предыдущего выполнения завершает

+1

Возможная дубликата [Transaction (идентификатор процесса) был заведен в тупик на ресурсах блокировки с другим процессом и был выбран в качестве тупиковой жертвы. Перезапустите транзакцию] (http://stackoverflow.com/questions/9212255/transaction-process-id-was-deadlocked-on-lock-resources-with-another-process-a) – MusicLovingIndianGirl

+0

@AishvaryaKarthik Я также добавил 'УРОВЕНЬ ИЗОЛЯЦИИ '.. Я также упоминаю это в моем вопросе –

+0

Есть ли индексы на вашей таблице, которые будут обновлены? – MikeAinOz

ответ

4

Короткий ответ

Вы, возможно, отсутствует индекс на вашем столе. Сначала вам нужно будет проверить, генерирует ли ваше обновление сканирование таблицы, если это так, создайте один индекс для ID и CID, чтобы узнать, разрешает ли это ваша проблема.

Длинный ответ

оператор Update на вашем столе может ввести сканирование таблицы. Это означает, что SQL Server читает каждую строку в вашей таблице, чтобы проверить, нужно ли обновлять строку. Во время этой операции чтения SQL Server выдает (U) блокировку обновления в строке. В случае, если строка нуждается в обновлении, она преобразует (U) блокировку в (X) исключительную блокировку и удерживает эту блокировку до конца транзакции. (U) несовместимы с другими (U) и (X) замками.

В вашем случае у вас есть 2 сеанса, ожидающие друг друга. Каждый сеанс помещает X-блокировку в (разные) строки и пытается выполнить блокировку (U) и считывает строку, обновленную другим сеансом (с блокировкой (X)). На самом деле это немного сложнее - у вас более двух сеансов, но я надеюсь, что у вас есть идея.

Создать индекс, чтобы избежать сканирования таблиц во время обновления

+0

Большое вам спасибо за вашу помощь. и он работает, но несколько раз он дает эту ошибку, я также добавил индексирование к моей таблице, теперь это работает как шарм ..спасибо за вашу помощь sir –

+0

Я рад, что это сработало! –

+0

Отличный анализ проблемы и действительно хороший ответ – MikeAinOz

 Смежные вопросы

  • Нет связанных вопросов^_^