假设这些数据库结构:
--On main server(server)
TicketRequest (id, date, count, start, end/*,and some other columns*/)
Ticket (id, reqId, blockedDate, usedDate, userId/*,and some other columns*/)
--and some other tables
--On linked server(gate)
--Just this table
Ticket (id, userId, blockedDate, usedDate)
ATicket
可以用在门上,所以在门上只是它usedDate
可能会改变。
在服务器端,Ticket
可能会被屏蔽、删除;或者在导入门的数据后,设置它的usedDate
.
我想在线同步它们。
我写了sp_server_export,sp_gate_import用于从服务器传输数据和 sp_gate_export,sp_server_import用于从门传输数据,以通过文件同步它们(server_export文件进入门,server_import文件返回服务器)。
我用过MERGE
,它的性能真的很好!现在,当我试图找到将服务器与门同步的解决方案时,经过一些搜索后不幸发现微软说:MERGE
不在远程表上工作!
那么,我如何与来自服务器的交易同步?!
注意:按照我们的计划,同步只能从服务器执行!门操作员根本无法更改数据库!
重要提示:考虑到并发是我最关心的问题!我想同步,而用户可能会删除Ticket
!或者一个Ticket
可能同时阻塞!或者在门口一个Ticket
可以使用!
更新 :
我们的同步逻辑是:
1 - 删除旧票(它与文件同步返回,returnDate
并且有modificationDate >
一个月后的时间戳,以确保从门中删除用过的票)
2 - 更新 gate.ticket 其中 usedDate 为空 set blockDate = server.blockDate;
3 - 从服务器插入新行
4 - 为转移到登机口的门票设置 transferDate(我的意思是步骤 2 和 3 中的新/更新门票)
5 - 从 gate.Ticket 更新 server.Ticket.usedDate,其中 gate.Ticket.usedDate 不为空。(这会将使用过的门票从登机口发送回服务器)
6 - 插入一个传输日志(在服务器上的传输日志表中)
您是否考虑过合并复制?这对我来说似乎是一个很好的解决方案。
https://learn.microsoft.com/en-us/sql/relational-databases/replication/merge/merge-replication
如果你想用来
MERGE
同步远程服务器上的表,但你不能因为它在远程服务器上.........您仍然应该能够使用单独的
UPDATE
andINSERT
语句来达到相同的效果。使用与 中相同的基本标准
MERGE
,您应该能够:UPDATE
所有已经存在的行;和INSERT
任何不存在的行。以该顺序执行此操作可避免更新您刚刚插入的行。
MERGE
实际操作中INSERT
和UPDATE
步骤是分开做的,所以并发问题应该不会比 with 差MERGE
。社区维基答案