G'day
Я думаю, что у меня есть неправильное понимание сериализуемого. У меня есть две таблицы (данные, транзакция), в которые я вставляю информацию в сериализуемую транзакцию (либо они оба включены, либо обе вне, но не в подвешенном состоянии).
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
INSERT INTO dbo.data (ID, data) VALUES (@Id, data)
INSERT INTO dbo.transactions(ID, info) VALUES (@ID, @info)
COMMIT TRANSACTION
У меня есть запрос на согласование, который проверяет таблицу данных на наличие записей, в которых нет транзакций на уровне изоляции зафиксированного чтения.
INSERT INTO reconciles (ReconcileID, DataID)
SELECT Reconcile = @ReconcileID, ID FROM Data
WHERE NOT EXISTS (SELECT 1 FROM TRANSACTIONS WHERE data.id = transactions.id)
Обратите внимание, что идентификатор на самом деле является составным (2 столбца) ключом, поэтому я не могу использовать оператор NOT IN
Насколько я понимаю, второй запрос исключил бы любые значения, записанные в данные без их транзакции, поскольку эта вставка происходила при сериализации, а чтение происходило при совершении чтения.
Итак, что я видел, так это то, что запрос Reconcile обнаружил записи данных, которые находятся в таблице данных, но не в таблице транзакций, когда вводились с этим запросом, что, по моему мнению, было невозможно из-за уровня изоляции.