Является ли номер последовательности журнала (LSN) уникальным для базы данных или таблицы в SQL Server?

Я использую SQL CDC для отслеживания изменений для нескольких таблиц в SQL Server. Я хотел бы сообщить об этих изменениях в правильной последовательности для каждой из них. У меня есть программа, которая собирает данные из каждой таблицы CDC. Но я хочу убедиться, что все изменения, которые происходят с этими таблицами, отображаются в правильной последовательности. Могу ли я полагаться на LSN для правильной последовательности?


person rauts    schedule 10.03.2015    source источник


Ответы (4)


Номер LSN уникален для данной транзакции, но не уникален глобально. Если у вас есть несколько записей в одной транзакции, все они будут иметь одно и то же значение __$start_lsn в cdc. Если вам нужен правильный порядок операций, вам нужно отсортировать по __$start_lsn, __$seqval, затем __$operation. __$seqval представляет собой идентификатор отдельной операции в транзакции упаковки.

Например, у меня есть таблица в схеме dbo с именем foo. Он имеет один столбец y. Если я запускаю этот оператор:

INSERT INTO dbo.foo VALUES (1); 
INSERT INTO dbo.foo VALUES (2);

Затем я увижу два отдельных значения LSN в cdc, потому что они находятся в двух отдельных транзакциях. Если я запускаю это:

BEGIN TRAN
INSERT INTO dbo.foo VALUES (1);
INSERT INTO dbo.foo VALUES (2);
COMMIT TRAN

Тогда я увижу одно значение LSN для обеих записей, но у них будут разные значения __$seqval, и seqval для моей первой записи будет меньше, чем seqval для моей второй записи.

person Trevor    schedule 13.03.2018

LSN уникален, постоянно увеличивается в базе данных, во всех таблицах этой базы данных.

person Hein    schedule 11.03.2015
comment
Спасибо за ответ. Есть ли официальная ссылка, подтверждающая это? - person rauts; 11.03.2015

В большинстве случаев значение LSN уникально для всех таблиц, однако я обнаружил случаи, когда одно единственное значение LSN относится к изменениям в 40 таблицах. Я не знаю сценарий SQL, связанный с этими изменениями, но я знаю, что все операции были «INSERT».

Не уверен, что это ошибка. Документация CDC плохая, охватывает только основы. Не многие пользователи знают, что в процессе захвата CDC есть много ошибок, подтвержденных MS для SQL 2014 и 2016 (у нас есть открытый случай).

Так что я бы не стал полагаться на документацию. В некоторых сценариях это может быть неправильно. Лучше реализовать больше проверок и протестировать на большом объеме различных комбинаций изменений.

person Anton    schedule 03.08.2016
comment
не могли бы вы предоставить ссылки на некоторые из упомянутых ошибок, пожалуйста? - person Grzes; 15.01.2019

Я тоже столкнулся с таким сценарием. По моему опыту и тому, что я понял, в вашем первом примере произошло 2 транзакции, поэтому вы действительно получите 2 разных LSN. В то время как во втором примере у вас есть только 1 транзакция с 2 запросами внутри. CDC будет считать это только одной транзакцией, поскольку она находится внутри BEGIN и END TRAN. Я не могу дать ссылки на вас, так как это мой личный опыт.

person christine    schedule 15.12.2020