Взаимная блокировка SQL Server Compact 4.0 для индекса __SysObjects с транзакциями ReadCommitted - PullRequest
0 голосов
/ 06 июня 2018

При исследовании проблемы тайм-аута / взаимоблокировки SQL Server Compact мне удалось воспроизвести проблему с двумя транзакциями с повторной передачей, вызывающими один запрос.

SELECT * 
FROM [MyTable] 
WHERE (FK_Id = 1);

Имя таблицы = __SysObjects, тип конфликта = slock (x blocks), Resource = RID: 1278: 2

Существует индекс на FK_Id, и более простой запрос, не использующий индекс, не затрагивается конфликтом блокировок.

SELECT *  
FROM [MyTable];

Удаление (и воссоздание) индекса также, похоже, решает проблему взаимоблокировки, хотя я могу восстановить исходный файл базы данных, чтобы получить такое поведение.

У меня вопрос, почему этопроисходит и могу ли я что-нибудь с этим сделать?На первый взгляд, это похоже на проблему с SQL Server Compact (транзакции только для чтения не должны вызывать взаимоблокировки, верно?), Но на данный момент я не в себе.

Согласно https://technet.microsoft.com/en-us/library/ms172932(v=sql.110).aspx запись 1278: 2 на __SysObjects имеет эксклюзивную блокировку, вызывающую проблему, я просто не знаю, что означает 1278: 2 или что делать с этими знаниями.

Структура таблицы выглядит следующим образом:

CREATE TABLE [MyTable] 
(
  [Id] int IDENTITY (1,1) NOT NULL
    CONSTRAINT [PK_Table] PRIMARY KEY,
  [FK_Id] int NOT NULL,
  [Title] nvarchar(255) NULL,
  [TS] rowversion NOT NULL
);
CREATE INDEX [IX_FKTable_FKId] ON [MyTable] ([FK_id] ASC);
ALTER TABLE [MyTable] ADD CONSTRAINT [FK_MyTab_FKID] FOREIGN KEY ([FK_Id]) REFERENCES [ParentTable]([Id]) ON DELETE CASCADE ON UPDATE CASCADE;
...