如果连接丢失,则将CRUD语句恢复到链接服务器的最佳做法

时间:2015-03-25 18:14:46

标签: sql-server linked-server service-broker transactional-replication

我正在寻找以下方案的最佳做法。

我们公司有CRM。当员工更新公司记录时,触发器会触发存储过程,该存储过程对托管我们网站的SQL DB的链接服务器具有CRUD语句。


问题:

当CRUD中间的连接丢失并且网站的SQL DB没有更新时会发生什么?在连接恢复时再次处理SQL语句的最佳方法是什么?

我读过有关Service Broker或事务复制的内容。其中一种更适合这种情况吗?


配置:

本地:SQL server 2008 R2

网站:SQL server 2008

2 个答案:

答案 0 :(得分:0)

这是处理它的一种方法,假设CRUD语句不是模态的,在某种意义上你必须在其他任何事情发生之前从链接服务器给用户做出响应:

触发器在本地表中存储在链接服务器上运行CRUD语句所需的所有元信息。

作业每隔n分钟运行一次读取表,尝试执行存储在表中的CRUD语句,并在链接服务器返回任何类型的成功消息时将其标记为已完成。那些不成功的人会留在桌子上,直到下次工作开始。

答案 1 :(得分:0)

如果事务在触发器中间失败,它仍将在事务中,并且数据将不会写入CRM数据库或Web数据库。还有潜在的性能问题,SQL服务器数据修改查询在本地和远程更改完成之前不会将控制权返回给客户端。如果查询执行异步,后者不会成为问题,但是fire and forget不是写入数据的好模式。

Service Broker允许您将修改写入某些二进制数据,并确保按顺序交付并在远程端正确处理。性能不会那么糟糕,因为插入队列的目的是快速完成将控制权返回给触发器并允许原始CRM查询完成。

然而,设置起来相当多。即使在本地服务器上使用服务代理进行简单任务也需要相当多的设置,部分原因是它旨在处理安全,多播,可靠的有序对话,因此需要几层才能工作。一旦它完成,那就非常可靠,并且你需要做很多工作来设置这种分布式对话。

我过去曾用它来创建一个网站回调系统,客户在网站上输入他们的号码并请求回拨,这是通过服务代理通过VPN从网络发送到后台服务器和客户端应用程序等待服务代理队列上的调用。设置完成后效率很高。