Порядковый номер журнала (LSN) уникален для базы данных или таблицы в SQL Server?
Я использую SQL CDC для отслеживания изменений для нескольких таблиц в SQL Server. Я хотел бы сообщать об этих изменениях в правильной последовательности для каждой программы, которая собирает данные из каждой таблицы CDC. Но я хочу убедиться, что все изменения, которые происходят с этими таблицами, отображаются в правильной последовательности. Могу ли я рассчитывать на LSN для правильной последовательности?
4 ответа
Номер LSN является уникальным для данной транзакции, но не является глобально уникальным. Если у вас есть несколько записей в одной транзакции, они все будут иметь одинаковое значение __$ start_lsn в cdc. Если вам нужен правильный порядок операций, вам нужно отсортировать по __$ start_lsn, __$seqval, затем __$ operation. __$seqval представляет идентификатор отдельной операции в транзакции переноса.
Например, у меня есть таблица в схеме dbo с именем foo. У него есть один столбец у. Если я запускаю это утверждение:
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 для моей второй записи.
Номер LSN уникален и постоянно увеличивается в базе данных во всех таблицах этой базы данных.
В большинстве случаев значение LSN уникально во всех таблицах, однако я обнаружил случаи, когда одно значение LSN относится к изменениям в 40 таблицах. Я не знаю сценарий SQL, связанный с этими изменениями, но я знаю, что все операции были "INSERT".
Не уверен, что это ошибка. Документация CDC оставляет желать лучшего, охватывает только основы. Не многие пользователи знают, что в процессе захвата CDC есть много ошибок, подтвержденных MS для SQL 2014 и 2016 (у нас есть открытый случай).
Поэтому я бы не стал полагаться на документацию. Это может быть неправильно в некоторых сценариях. Лучше реализовать больше проверок и протестировать их с большим объемом различных комбинаций изменений.
Я тоже столкнулся с таким сценарием. По моему опыту и тому, что я понял, в вашем первом примере произошло 2 транзакции, поэтому вы действительно получите 2 разных LSN. В то время как во втором примере у вас есть только 1 транзакция с 2 запросами внутри. CDC будет считать это только одной транзакцией, поскольку она находится внутри BEGIN и END TRAN. Я не могу дать ссылки на вас, так как это мой личный опыт.