Добре, що я не можу цього зрозуміти, але намагаюся відповісти.
Ви сказали, що вам потрібно високоефективне рішення, яке працює часто (мінімум усі 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 копійки. Сподіваємось, у вас хороший огляд, і, можливо, ви знайшли одне рішення, яке працює для вас.