Взаимная блокировка на SQL Server только при локальном запуске базы данныхJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Взаимная блокировка на SQL Server только при локальном запуске базы данных

Сообщение Anonymous »

При попытке локального тестирования приложения (Java, Spring boot, спящий режим, сервер SQl в качестве базы данных) я замечаю значительную взаимоблокировку, приложение и база данных работают на моем компьютере во время теста. Никакой тупиковой ситуации в промежуточной или производственной среде не происходит (однако мой компьютер гораздо мощнее, чем серверы и база данных, работающая в контейнере на моем компьютере).
Я тестирую определенную часть приложение, которое выполняет пакетный импорт, в основном оно использует строки из таблицы, которые представляют события в контракте и товарах (контракт имеет несколько элементов), и импортирует их в две таблицы: «контракт» и «элемент», сохраняя их в конечном состоянии .
События обрабатываются несколькими потоками, но поток обрабатывает только события, относящиеся к одному контракту, поэтому разные потоки не взаимодействуют с одними и теми же строками в контракте и элементе. таблица:
Кажется, существует определенная часть кода (относящаяся к типу контракта), которая вызывает взаимоблокировку, я собрал отчет о взаимоблокировке с сервера 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
Отчет о взаимоблокировке сервера sql:

Код: Выделить всё











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
































План выполнения запросов, отображаемых в отчете о взаимоблокировках: https://www.brentozar.com/pastetheplan/?id=SkazSLS1kg и https://www. .brentozar.com/pastetheplan/?id=SJOZvIHJJg
Я загрузил журналы приложений с транзакциями и SQL здесь: https://drive.google.com/file/d/1K4Lt4X ... 8u61X2DJZ/ view?usp=drive_link
Мне нужен совет о том, что я могу улучшить в приложении, чтобы уменьшить количество взаимоблокировок.

Подробнее здесь: https://stackoverflow.com/questions/790 ... se-locally
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»