Я тестирую определенную часть приложение, которое выполняет пакетный импорт, в основном оно использует строки из таблицы, которые представляют события в контракте и товарах (контракт имеет несколько элементов), и импортирует их в две таблицы: «контракт» и «элемент», сохраняя их в конечном состоянии .
События обрабатываются несколькими потоками, но поток обрабатывает только события, относящиеся к одному контракту, поэтому разные потоки не взаимодействуют с одними и теми же строками в контракте и элементе. таблица:
Кажется, существует определенная часть кода (относящаяся к типу контракта), которая вызывает взаимоблокировку, я собрал отчет о взаимоблокировке с сервера sql и трассировку приложения с транзакцией log и ведение журнала в спящем режиме, но я не знаком с взаимоблокировкой, и мне трудно понять, как узнать, что на самом деле происходит.
Соответствующие таблицы DDL :< /p>
Код: Выделить всё
use INVOICE
go
create table dbo.contract
(
reference varchar(16) not null
primary key,
client_code varchar(64) not null,
created_date date not null,
agency_reference varchar(32),
channel varchar(32),
external_code varchar(64),
new_client bit default 1 not null,
owner_type varchar(32),
status varchar(32),
target_period varchar(7),
type varchar(32),
created_by_isilis bit default 1 not null,
partial_mobility bit default 0 not null,
new_iban varchar(36),
new_bank_account_name varchar(70),
old_iban varchar(70),
emitter_iban varchar(70),
owner_name varchar(110),
signed_date date,
already_invoiced bit default 0 not null,
is_dsp2 bit default 0 not null,
dsp2_status varchar(36)
)
go
create index idx_contract_period_client
on dbo.contract (target_period, client_code)
go
create index idx_contract_period_client_type
on dbo.contract (target_period, client_code, type)
go
use INVOICE
go
create table dbo.item
(
reference varchar(16) not null
primary key,
contract_reference varchar(16) not null,
name varchar(256),
created_date date not null,
sent_date date,
status varchar(32),
target_period varchar(7),
finalised_by_isilis bit default 0 not null,
physical bit default 0 not null,
small bit default 0 not null,
has_email bit default 0 not null,
ics varchar(64),
is_dsp2 bit default 0 not null
)
go
create index ITEM_CONTRACT_REFERENCE
on dbo.item (contract_reference, reference)
go
Код: Выделить всё
unknown
unknown
(@P0 nvarchar(4000))select contracten0_.reference as referenc1_1_1_,
contracten0_.agency_reference as agency_r2_1_1_, contracten0_.already_invoiced as
already_3_1_1_, contracten0_.channel as channel4_1_1_, contracten0_.client_code as
client_c5_1_1_, contracten0_.created_by_isilis as created_6_1_1_, contracten0_.created_date
as created_7_1_1_, contracten0_.dsp2_status as dsp8_1_1_, contracten0_.emitter_iban as
emitter_9_1_1_, contracten0_.external_code as externa10_1_1_, contracten0_.is_dsp2 as
is_dsp11_1_1_, contracten0_.new_bank_account_name as new_ban12_1_1_, contracten0_.new_client
as new_cli13_1_1_, contracten0_.new_iban as new_iba14_1_1_, contracten0_.old_iban as
old_iba15_1_1_, contracten0_.owner_name as owner_n16_1_1_, contracten0_.owner_type as
owner_t17_1_1_, contracten0_.partial_mobility as partial18_1_1_, contracten0_.signed_date as
signed_19_1_1_, contracten0_.status as status20_1_1_, contracten0_.target_period as
target_21_1_1_, contracten0_.type as type22_1_1_, items1_.contract_reference as con
unknown
unknown
(@P0 nvarchar(4000),@P1 bit,@P2 nvarchar(4000),@P3 nvarchar(4000),@P4 bit,@P5 date,@P6
nvarchar(4000),@P7 nvarchar(4000),@P8 nvarchar(4000),@P9 bit,@P10 nvarchar(4000),@P11
bit,@P12 nvarchar(4000),@P13 nvarchar(4000),@P14 nvarchar(4000),@P15 nvarchar(4000),@P16
bit,@P17 date,@P18 nvarchar(4000),@P19 nvarchar(4000),@P20 nvarchar(4000),@P21
nvarchar(4000))update contract set agency_reference= @P0 , already_invoiced= @P1 , channel=
@P2 , client_code= @P3 , created_by_isilis= @P4 , created_date= @P5 , dsp2_status= @P6 ,
emitter_iban= @P7 , external_code= @P8 , is_dsp2= @P9 , new_bank_account_name= @P10 ,
new_client= @P11 , new_iban= @P12 , old_iban= @P13 , owner_name= @P14 , owner_type= @P15 ,
partial_mobility= @P16 , signed_date= @P17 , status= @P18 , target_period= @P19 , type= @P20
where reference= @P21
unknown
unknown
(@P0 nvarchar(4000),@P1 bit,@P2 nvarchar(4000),@P3 nvarchar(4000),@P4 bit,@P5 date,@P6
nvarchar(4000),@P7 nvarchar(4000),@P8 nvarchar(4000),@P9 bit,@P10 nvarchar(4000),@P11
bit,@P12 nvarchar(4000),@P13 nvarchar(4000),@P14 nvarchar(4000),@P15 nvarchar(4000),@P16
bit,@P17 date,@P18 nvarchar(4000),@P19 nvarchar(4000),@P20 nvarchar(4000),@P21
nvarchar(4000))update contract set agency_reference= @P0 , already_invoiced= @P1 , channel=
@P2 , client_code= @P3 , created_by_isilis= @P4 , created_date= @P5 , dsp2_status= @P6 ,
emitter_iban= @P7 , external_code= @P8 , is_dsp2= @P9 , new_bank_account_name= @P10 ,
new_client= @P11 , new_iban= @P12 , old_iban= @P13 , owner_name= @P14 , owner_type= @P15 ,
partial_mobility= @P16 , signed_date= @P17 , status= @P18 , target_period= @P19 , type= @P20
where reference= @P21
Я загрузил журналы приложений с транзакциями и SQL здесь: https://drive.google.com/file/d/1K4Lt4X ... 8u61X2DJZ/ view?usp=drive_link
Мне нужен совет о том, что я могу улучшить в приложении, чтобы уменьшить количество взаимоблокировок.
Подробнее здесь: https://stackoverflow.com/questions/790 ... se-locally