我需要同步(接下来首先上传到远程数据库下载到移动设备)带有来自移动设备的远程数据库的数据库表(可能会插入/更新/删除来自多个表的行。)
远程数据库根据上传的同步数据执行其他操作。当同步继续将数据下载到移动设备时,远程数据库仍然执行先前的任务并导致同步失败。像'严重条件'这样的'同步和数据库操作'都希望访问远程数据库。如何解决这个问题?是否可以同时执行同步DB并在同一个DB上运行?
使用的是Sql server 2008 DB和mobilink sync。
编辑: 我按顺序进行的操作:
1.一台装有应用程序的iPhone,它使用mobilink作为SYNC数据。
2.SYNC表示UPLOAD(从设备到远程数据库),然后是DOWNLOAD(从远程DB到设备)。
3.Remote DB表示Consolidated DB;设备Db是Ultralite DB。
4.Remote DB在更新某些表时会触发一些触发器。
5.从设备到远程的UPLOAD将在同步上传完成时触发触发器。
6.接下来,UPLOAD完成DOWNLOAD到设备启动。
7.那些数据库触发器将在同一时刻触发。
8.现在发生了DB SYNC(-DOWNLOAD)和触发器(包含在其中的更新查询)之间的死锁。
9.Sync失败,错误提示无法访问某些表。
答案 0 :(得分:1)
我做了很多工作和谷歌!针对这个问题提出了一个简单的(?!)解决方案。 (虽然确切的问题在这一点上无法解决..我尽我所能。)
任何比这更好的方法将不胜感激!欢迎所有建议!
答案 1 :(得分:1)
我对您的系统的理解如下:
UPDATE
语句发送到SQL Server DB。ON UPDATE
触发器,它会更新大约30个表(=触发器中的至少30个UPDATE
语句+ 1主更新语句)UPDATE
在单个事务中执行。当Trigger完成所有更新时,此事务结束。UPDATE
完成并发送多个SELECT
语句以从数据库中获取数据。SELECT
语句查询相同的表,因为上面的触发器正在更新。在优化时,我们正在努力使我们的流程不易于计算机,在较少的迭代中实现相同的结果,并使用更少的资源或更多可用/更少重载的资源。
我对您的设计的建议:
使用参数化SP。每次SQL Server收到任何语句时,它都会创建执行计划。对于具有触发器DB的1 UPDATE语句,需要至少31个执行计划。每次应用更新数据库时,它都会在繁忙的生产环境中发生。这是一个很大的浪费。
SP如何帮助减少阻塞? 现在,您有31个查询的1个事务,其中针对所涉及的所有表发出锁并保持直到事务提交。使用SP,您将有31个小事务,一次只能锁定1-2个表。
我想解决的另一个问题:如何对数据库进行异步更新? SQL Server中有一个名为Service Broker的功能。它允许自动处理消息队列(来自队列表的行):它监视队列,从中获取消息,并处理您指定和删除队列中的消息。
例如,您保存SP的参数 - 消息 - 并且Service Broker使用参数执行SP。