Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
katrina_v
Member

Откуда: Екатеринбург
Сообщений: 9
Node:1

2012-05-12 03:53:11.78 spid6s PAGE: 5:4:1419939 CleanCnt:2 Mode:X Flags: 0x3
2012-05-12 03:53:11.78 spid6s Grant List 3:
2012-05-12 03:53:11.78 spid6s Owner:0x0000000084ED4B00 Mode: X Flg:0x40 Ref:0 Life:02000000 SPID:130 ECID:0 XactLockInfo: 0x000000021241F410
2012-05-12 03:53:11.78 spid6s Requested by:
2012-05-12 03:53:11.78 spid6s ResType:LockOwner Stype:'OR'Xdes:0x000000022D3A5970 Mode: IX SPID:107 BatchID:0 ECID:0 TaskProxy:(0x0000000254510538) Value:0xa2f62b80 Cost:(0/7980)
2012-05-12 03:53:11.78 spid6s
2012-05-12 03:53:11.78 spid6s

Node:2

2012-05-12 03:53:11.78 spid6s PAGE: 5:4:3147582 CleanCnt:2 Mode:IX Flags: 0x3
2012-05-12 03:53:11.78 spid6s Grant List 2:
2012-05-12 03:53:11.78 spid6s Owner:0x00000000E5311440 Mode: IX Flg:0x40 Ref:0 Life:02000000 SPID:107 ECID:0 XactLockInfo: 0x000000022D3A59B0
2012-05-12 03:53:11.78 spid6s SPID: 107 ECID: 0 Statement Type: INSERT Line #: 4
2012-05-12 03:53:11.78 spid6s Input Buf: Language Event: set xact_abort on

declare @last_run_outcome int
select top 1
@last_run_outcome = st.last_run_outcome
from master.dbo.sysprocesses p with( nolock )
inner join msdb.dbo.sysjobsteps st with( nolock )
on p.program_name like N'%(Job
2012-05-12 03:53:11.78 spid6s Requested by:
2012-05-12 03:53:11.78 spid6s ResType:LockOwner Stype:'OR'Xdes:0x000000021241F3D0 Mode: X SPID:130 BatchID:0 ECID:0 TaskProxy:(0x00000002426CA538) Value:0x8180a280 Cost:(0/3426968)
2012-05-12 03:53:11.78 spid6s
2012-05-12 03:53:11.78 spid6s Victim Resource Owner:
2012-05-12 03:53:11.78 spid6s ResType:LockOwner Stype:'OR'Xdes:0x000000022D3A5970 Mode: IX SPID:107 BatchID:0 ECID:0 TaskProxy:(0x0000000254510538) Value:0xa2f62b80 Cost:(0/7980)
12 май 12, 09:24    [12540291]     Ответить | Цитировать Сообщить модератору
 Re: И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Вот теперь у вас дедлок на страницах. Показывайте задедлочившиеся стейтменты.

З.Ы. Обычно такие дедлоки лечатся или rowlock'ом, или сразу tablock'ом.
12 май 12, 11:07    [12540848]     Ответить | Цитировать Сообщить модератору
 Re: И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
katrina_v
Member

Откуда: Екатеринбург
Сообщений: 9
Выпонив dbcc page (5, 4, 1419939) и dbcc page (5, 4, 3147582).
Получила в обоих случаях Metadata: ObjectId = 453576654 .
После определила имя объекта запросом select object_name(453576654) - "h_ussd_dialogue".

Вторым участником дедлока является процедура:
ALTER procedure [dbo].[p_ussd_delete_manager]
as
set xact_abort on

-------------------------------------------------------------------------------------------------
-- определяем необходимые настройки
declare @rowcount_limit int
, @actual_rowcount int

select @rowcount_limit = cast( dbo.f_get_settings( 'USSD_DELETE_MANAGER_ROWCOUNT_LIMIT' ) as int )

declare @d table ( dialogue_id bigint, dialogue_id_ int )

if ( @rowcount_limit is null )
goto SETTINGS_ERROR

DELETE_MANAGER_START:
-------------------------------------------------------------------------------------------------
-- удаляем данные для закрытых диалогов

set rowcount @rowcount_limit
set @actual_rowcount = 0

-- закрываем диалоги с истекшим сроком жизни или периодом неактивности
update d
set dialogue_state_id = 4 -- abort dialogue
from ussd_dialogue d
with ( rowlock, readpast, updlock, index( pk_ussd_dialogue ) )
where dialogue_state_id not in ( 3, 4 )
and ( validity_datetime < getdate()
or activity_datetime < dateadd( ss, -activity_timer, getdate() )
)
option ( maxdop 1 )

set @actual_rowcount = case
when @actual_rowcount < @@rowcount then @@rowcount
else @actual_rowcount
end

-- удаляем закрытые диалоги и примитивы для них
insert into @d ( dialogue_id, dialogue_id_ )
select dialogue_id, dialogue_id_
from ussd_dialogue
with ( rowlock, readpast, updlock, index( pk_ussd_dialogue ) )
where dialogue_state_id in ( 3, 4 ) -- CLOSED, ABORTED
and transfer_completed = 1
option ( force order, loop join, maxdop 1 )

set @actual_rowcount = case
when @actual_rowcount < @@rowcount then @@rowcount
else @actual_rowcount
end

set rowcount 0

delete x
from @d d_
inner join ussd_service_primitive_in x with ( rowlock, readpast, updlock, index( nc_idx_ussd_service_primitive_in_dialogue_id ) )
on x.dialogue_id = d_.dialogue_id_
option ( force order, loop join, maxdop 1 )

delete x
from @d d_
inner join ussd_service_primitive_out x with ( rowlock, readpast, updlock, index( nc_idx_ussd_service_primitive_out_dialogue_id ) )
on x.dialogue_id = d_.dialogue_id_
option ( force order, loop join, maxdop 1 )

delete x
from @d d_
inner join smpp_deliver x with ( rowlock, readpast, updlock, index( nc_idx_smpp_deliver_dialogue_id ) )
on x.dialogue_id = d_.dialogue_id_
option ( force order, loop join, maxdop 1 )

delete x
from @d d_
inner join smpp_submit x with ( rowlock, readpast, updlock, index( nc_idx_smpp_submit_dialogue_id ) )
on x.dialogue_id = d_.dialogue_id_
option ( force order, loop join, maxdop 1 )

delete d
from @d d_
inner join ussd_dialogue d with ( rowlock )
on d.dialogue_id = d_.dialogue_id
option ( force order, loop join, maxdop 1 )


if ( @actual_rowcount = @rowcount_limit )
goto DELETE_MANAGER_START

--
return 0

SETTINGS_ERROR:
raiserror( 'Undefined system settings', 15, 1 )
return 1

В данной процедуре происходит удаление из оперативных таблиц в таблицы истории с таким же названием с префиксом h_...
Так как для второго участника указана строчка 4, то я предполагаю что дедлок происходит при выполнения триггера на таблице ussd_dialogue.

Триггер:
ALTER trigger [dbo].[tr_ussd_dialogue_for_delete]
on [dbo].[ussd_dialogue] for delete
as
insert into h_ussd_dialogue( dialogue_id, dialogue_id_, datetime, validity_datetime, activity_timer, activity_datetime, network_initiated, dialogue_state_id, [auto_close], invoke_id, address_ton, address_npi, [address], address_original, smpp_system_id, esme_address_ton, esme_address_npi, esme_address, esme_address_original, failure_cause, transfer_completed, appl_context_version, address_transform_id, esme_address_transform_id )
select dialogue_id, dialogue_id_, datetime, validity_datetime, activity_timer, activity_datetime, network_initiated, dialogue_state_id, [auto_close], invoke_id, address_ton, address_npi, [address], address_original, smpp_system_id, esme_address_ton, esme_address_npi, esme_address, esme_address_original, failure_cause, transfer_completed, appl_context_version, address_transform_id, esme_address_transform_id
from deleted
Как определить первого участника дедлока?
12 май 12, 11:22    [12540986]     Ответить | Цитировать Сообщить модератору
 Re: И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
katrina_v
Member

Откуда: Екатеринбург
Сообщений: 9
Таблица h_ussd_dialogue используется только в этой процедуре (удаление из таблиц истории):

ALTER procedure [dbo].[p_ussd_history_delete_manager]
as
declare @period_of_storage int
, @rowcount_limit int
, @repeat_flag bit
, @validity_datetime datetime

, @validity_dialogue_id bigint
, @validity_dialogue_id_ bigint
, @validity_primitive_id_in bigint
, @validity_primitive_id_out bigint

, @validity_deliver_pdu_id bigint
, @validity_submit_pdu_id bigint

select @period_of_storage = convert( int, dbo.f_get_settings( 'PERIOD_OF_STORAGE' ) )
, @rowcount_limit = convert( int, dbo.f_get_settings( 'USSD_HISTORY_DELETE_MANAGER_ROWCOUNT_LIMIT' ) )

if ( @period_of_storage is null
or @rowcount_limit is null )
goto SETTINGS_ERROR

set @validity_datetime = isnull( @validity_datetime, dateadd( ss, -@period_of_storage, getdate() ) )

-------------------------------------------------------------------------------------------------
-- определяем границу
select top 1 @validity_dialogue_id = dialogue_id
, @validity_dialogue_id_ = dialogue_id_
from h_ussd_dialogue
with ( nolock, index ( nc_idx_datetime ) )
where [datetime] < @validity_datetime
order by [datetime] desc

select top 1 @validity_primitive_id_in = pdu_id
from h_ussd_service_primitive_in
with ( nolock, index ( nc_idx_dialogue_id ) )
where dialogue_id = @validity_dialogue_id_

select top 1 @validity_primitive_id_out = pdu_id
from h_ussd_service_primitive_out
with ( nolock, index ( nc_idx_dialogue_id ) )
where dialogue_id = @validity_dialogue_id_

select top 1 @validity_deliver_pdu_id = pdu_id
from h_smpp_deliver
with ( nolock, index ( nc_idx_datetime ) )
where datetime < @validity_datetime
order by [datetime] desc

select top 1 @validity_submit_pdu_id = pdu_id
from h_smpp_submit
with ( nolock, index ( nc_idx_datetime ) )
where datetime < @validity_datetime
order by [datetime] desc

set rowcount @rowcount_limit

set @repeat_flag = 1

DELETE_START:
if ( @repeat_flag = 0 )
goto DELETE_COMPLETE

set @repeat_flag = 0

-------------------------------------------------------------------------------------------------
-- USSD
delete from h_ussd_dialogue where dialogue_id < @validity_dialogue_id
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_ussd_service_primitive_in where pdu_id < @validity_primitive_id_in
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_ussd_service_primitive_out where pdu_id < @validity_primitive_id_out
if ( @@rowcount != 0 ) set @repeat_flag = 1

-------------------------------------------------------------------------------------------------
-- SMPP
-- pdu_id
delete from h_smpp_submit where pdu_id < @validity_submit_pdu_id
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete hsr from h_smpp_submit_resp hsr with ( index ( nc_idx_original_pdu_id ) ) where original_pdu_id < @validity_submit_pdu_id
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_deliver where pdu_id < @validity_deliver_pdu_id
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete hdr from h_smpp_deliver_resp hdr with ( index ( nc_idx_original_pdu_id ) ) where original_pdu_id < @validity_deliver_pdu_id
if ( @@rowcount != 0 ) set @repeat_flag = 1

-- datetime
delete from h_smpp_bind_receiver where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_bind_receiver_resp where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_bind_transceiver where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_bind_transceiver_resp where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_bind_transmitter where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_bind_transmitter_resp where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_enquire_link_in where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_enquire_link_out where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_enquire_link_resp_in where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_enquire_link_resp_out where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_generic_nack_in where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_generic_nack_out where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_session where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_unbind_in where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

delete from h_smpp_unbind_resp_out where [datetime] < @validity_datetime
if ( @@rowcount != 0 ) set @repeat_flag = 1

goto DELETE_START

DELETE_COMPLETE:
set rowcount 0
return 0

SETTINGS_ERROR:
raiserror( 'Undefined system settings', 15, 1 )
return 1

Не понятно почему может возникнуть дедлок.
12 май 12, 11:57    [12541283]     Ответить | Цитировать Сообщить модератору
 Re: И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
katrina_v
Не понятно почему может возникнуть дедлок.


Да это еще что, вот совершенно непонятно чего бы тэгом SRC не пользоваться? А при оформлении таких "простыней" особенно...
12 май 12, 12:40    [12541647]     Ответить | Цитировать Сообщить модератору
 Re: И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
step_ks
Member

Откуда:
Сообщений: 936
katrina_v, хинты поубирать не желаете?
12 май 12, 12:49    [12541706]     Ответить | Цитировать Сообщить модератору
 Re: И снова о дедлоках ), помогите расшифровать дедлок между страницами  [new]
step_ks
Member

Откуда:
Сообщений: 936
katrina_v
Как определить первого участника дедлока?

Сервер какой? если 2005 и выше, то граф с с флагом 1222 может быть поинформативнее.
12 май 12, 12:53    [12541736]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить