Я использую SQL CDC для отслеживания изменений для нескольких таблиц в SQL Server. Я хотел бы сообщить об этих изменениях в правильной последовательности для каждой из них. У меня есть программа, которая собирает данные из каждой таблицы CDC. Но я хочу убедиться, что все изменения, которые происходят с этими таблицами, отображаются в правильной последовательности. Могу ли я полагаться на LSN для правильной последовательности?
Является ли номер последовательности журнала (LSN) уникальным для базы данных или таблицы в SQL Server?
Ответы (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 для моей второй записи.
LSN уникален, постоянно увеличивается в базе данных, во всех таблицах этой базы данных.
В большинстве случаев значение LSN уникально для всех таблиц, однако я обнаружил случаи, когда одно единственное значение LSN относится к изменениям в 40 таблицах. Я не знаю сценарий SQL, связанный с этими изменениями, но я знаю, что все операции были «INSERT».
Не уверен, что это ошибка. Документация CDC плохая, охватывает только основы. Не многие пользователи знают, что в процессе захвата CDC есть много ошибок, подтвержденных MS для SQL 2014 и 2016 (у нас есть открытый случай).
Так что я бы не стал полагаться на документацию. В некоторых сценариях это может быть неправильно. Лучше реализовать больше проверок и протестировать на большом объеме различных комбинаций изменений.
Я тоже столкнулся с таким сценарием. По моему опыту и тому, что я понял, в вашем первом примере произошло 2 транзакции, поэтому вы действительно получите 2 разных LSN. В то время как во втором примере у вас есть только 1 транзакция с 2 запросами внутри. CDC будет считать это только одной транзакцией, поскольку она находится внутри BEGIN и END TRAN. Я не могу дать ссылки на вас, так как это мой личный опыт.