Добре, що я не можу цього зрозуміти, але намагаюся відповісти.
Ви сказали, що вам потрібно високоефективне рішення, яке працює часто (мінімум усі 2 хвилини) і вам потрібен хороший підхід, який повинен бути швидким, не замикаючись. Але ви не хочете, щоб система blackbox.
Замість системи blackbox, яка використовується на мільйонах установок з хорошими результатами, ви намагаєтесь знову винайти колесо і створити власне рішення? Гм, це звучить трохи дивно.
Насправді це мої пропозиції.
- Реплікація, навіть якщо ви сказали, що не будете її використовувати. Це досить просте і найкраще рішення, яке ви можете використовувати для цього. Реплікацію легко встановити, швидко копіювати, і вам не доведеться винаходити колесо знову. Якщо ви просто дивно про блокування, ви можете спробувати встановити
ISOLATION LEVEL
в READ_COMMITTED_SNAPSHOT
. Більше про це можна прочитати тут . Це задіяє частину вашого tempdb, але ваша таблиця завжди читається і записується, і реплікація може працювати у фоновому режимі.
Дивіться приклад нижче:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Change Data Capture) також може бути рішенням. Але таким чином потрібно будувати майже все самостійно. І я зробив досвід, який
CDC
може стати крихкою справою за деяких обставин. CDC
буде захоплювати всі дані в переглянутій таблиці (потрібно вказати кожну переглянуту таблицю вручну). Після цього ви отримаєте значення раніше та значення після INSERT
, UPDATE
або DELETE
. CDC
буде зберігати цю інформацію протягом певного часу (ви можете вказати її самостійно). Підхід може бути використаний CDC
для певних таблиць, які потрібно переглянути і вручну повторити ці зміни в іншій базі даних. До речі, CDC
під капотом теж використовується реплікація SQL Server. ;-) Більше про це можна прочитати тут .
Попередження: CDC
зміни не будуть відомі DDL
. Це означає, що якщо ви зміните таблицю і додасте новий стовпець, вона CDC
буде переглядати таблицю, але ігнорувати всі зміни до нового стовпця. Насправді він записує лише NULL
як значення до та значення після. Потрібно повторно DDL
активізувати його після -Зміни на переглянуту таблицю.
- Вище описаний спосіб є чимось схожим на захоплення робочого навантаження за допомогою SQL Server Profiler і запустити його знову в іншій базі даних для деяких орієнтирів. Що ж, це може спрацювати. Але факт занадто багато побічних ефектів для мене трохи важкий. Що ви робите, якщо здійснюєте процедурний дзвінок у свого клієнта. Згодом виконати ту саму команду у вашій базовій базі даних, яка не синхронізована? Процедура може запуститися, але вона може видалити / оновити / вставити рядки, яких не було у вашого клієнта. Або як ви керуєтесь кількома клієнтами за одним принципом. Я думаю, що це занадто хитро. У гіршому випадку ви, ймовірно, руйнуєте свою цілісність.
- Іншою ідеєю може бути додаток на основі або використання тригера. Залежно від того, скільки таблиць потрібно синхронізувати. Ви можете записати всі зміни в окрему таблицю інсценізації та запустити роботу агента SQL Server усі хвилини, щоб синхронізувати ці рядки в таблиці інсценізації з вашим майстром. Але це може бути важким, якщо ви спробуєте синхронізувати (наприклад) 150 таблиць. У вас були б великі накладні витрати.
Ну це мої 2 копійки. Сподіваємось, у вас хороший огляд, і, можливо, ви знайшли одне рішення, яке працює для вас.