如何在同一时间更新和同步数据库表?

时间:2014-04-17 06:59:23

标签: sql-server database sql-server-2008 database-design triggers

我需要同步(接下来首先上传到远程数据库下载到移动设备)带有来自移动设备的远程数据库的数据库表(可能会插入/更新/删除来自多个表的行。)

远程数据库根据上传的同步数据执行其他操作。当同步继续将数据下载到移动设备时,远程数据库仍然执行先前的任务并导致同步失败。像'严重条件'这样的'同步和数据库操作'都希望访问远程数据库。如何解决这个问题?是否可以同时执行同步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失败,错误提示无法访问某些表。

2 个答案:

答案 0 :(得分:1)

我做了很多工作和谷歌!针对这个问题提出了一个简单的(?!)解决方案。 (虽然确切的问题在这一点上无法解决..我尽我所能。)

  1. 跟踪所有同步的客户(用户详细信息类型)。
  2. 创建一个sql作业调度程序,其中包含用户同步时要执行的所有操作。
  3. 每天针对已保存的用户/客户端同步详细信息,执行sql job的任务,宣布“维护期”
  4. 每次跟踪客户详细信息的费用都很高,但非常需要!
  5. 远程合并数据库仅在维护期后“完全更新”。
  6. 任何比这更好的方法将不胜感激!欢迎所有建议!

答案 1 :(得分:1)

我对您的系统的理解如下:

  1. 移动应用程序将UPDATE语句发送到SQL Server DB。
  2. ON UPDATE触发器,它会更新大约30个表(=触发器中的至少30个UPDATE语句+ 1主更新语句)
  3. UPDATE在单个事务中执行。当Trigger完成所有更新时,此事务结束。
  4. 移动应用程序不会等待UPDATE完成并发送多个SELECT语句以从数据库中获取数据。
  5. 这些SELECT语句查询相同的表,因为上面的触发器正在更新。
  6. 在某些用户的某些查询中发生阻塞和死锁,因为Trigger在选择之前未完成更新并保持对表的锁定。
  7. 在优化时,我们正在努力使我们的流程不易于计算机,在较少的迭代中实现相同的结果,并使用更少的资源或更多可用/更少重载的资源。

    我对您的设计的建议:

    1. 使用参数化SP。每次SQL Server收到任何语句时,它都会创建执行计划。对于具有触发器DB的1 UPDATE语句,需要至少31个执行计划。每次应用更新数据库时,它都会在繁忙的生产环境中发生。这是一个很大的浪费。

    2. SP如何帮助减少阻塞? 现在,您有31个查询的1个事务,其中针对所涉及的所有表发出锁并保持直到事务提交。使用SP,您将有31个小事务,一次只能锁定1-2个表。

    3. 我想解决的另一个问题:如何对数据库进行异步更新? SQL Server中有一个名为Service Broker的功能。它允许自动处理消息队列(来自队列表的行):它监视队列,从中获取消息,并处理您指定和删除队列中的消息。

      例如,您保存SP的参数 - 消息 - 并且Service Broker使用参数执行SP。