我有一个.NET应用程序,它使用Microsoft同步框架在SQL Server 2008 R2服务器和许多SQL Server CE客户端之间同步数据。
初始同步成功下载服务器上的数据,但是同步日志记录表明它然后执行上传刚刚完成下载的未更改数据。这大大延长了初始同步时间。
从下面的SQL CE日志中提取(这是其中一个表的初始同步):
***** Client Provider Commit Transaction ****
Connecting to database: Data\Database.sdf
**** Client Provider Begin Transaction ****
----- Client Applying Changes from Server for Group "Staff" -----
----- Applying Deletes for Table Staff-----
Deletes Applied: 0
--- End Applying Deletes for Table Staff-----
----- Applying Upserts for Table Staff-----
----- Applying Inserts for Table Staff-----
Inserts Applied: 1
----- Applying Updates for Table Staff-----
Updates Applied: 0
--- End Applying Upserts for Table Staff---
Staff: Set ReceivedAnchor value: 1832
--- End Client Applying Changes from Server for Group "Staff" ---
这是更改被错误地上传回服务器的日志,即当没有任何更改时标记为更新。
SELECT ut.* FROM (select ut0.* from [Staff] as ut0 where (ut0.__sysTrackingContext <>
@CNTX OR ut0.__sysTrackingContext IS NULL) AND ut0.__sysChangeTxBsn >= @LBSN ) as ut
LEFT OUTER JOIN (select txcs0.* from __sysTxCommitSequence as txcs0) as txcsInsert ON
ut.__sysInsertTxBsn = txcsInsert.__sysTxBsn LEFT OUTER JOIN (select txcs0.* from
__sysTxCommitSequence as txcs0) as txcsUpdate ON ut.__sysChangeTxBsn = txcsUpdate.__sysTxBsn
WHERE COALESCE(txcsUpdate.__sysTxCsn, ut.__sysChangeTxBsn) > @LCSN AND COALESCE
(txcsUpdate.__sysTxCsn, ut.__sysChangeTxBsn) <= @ECSN AND (COALESCE(txcsInsert.__sysTxCsn,
ut.__sysInsertTxBsn) <= @LCSN OR COALESCE(txcsInsert.__sysTxCsn, ut.__sysInsertTxBsn) IS NULL
OR ut.__sysInsertTxBsn IN (SELECT SyncBsn FROM __syncTransactions))
Parameter: @LCSN Value: 0
Parameter: @LBSN Value: 0
Parameter: @ECSN Value: 408
Parameter: @CNTX Value: 73c9795b-29e5-49c3-8a66-f99f667225d5
Update for row with PK: StaffId = 1
在服务器端,跟踪当前版本在初始同步期间没问题,然后在某个时刻递增,我假设是由于客户认为下载的记录是新的。
可能导致这种情况的一件事是禁用跟踪来设置SyncScopes然后启用。这是在初始同步之后完成的。
不确定我是否提供了足够有用的信息。很乐意提供更多。
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
你是如何进行初始同步的?如果您在不使用Sync Framework的情况下执行此操作或禁用跟踪,则Sync Framework不知道最初同步的内容。
答案 1 :(得分:0)
解决了这个问题(至少在一个可行(不理想)的解决方案中)。这是一个有趣的设计。同步中涉及三个单元。服务器,中央同步设备和边缘设备。同步发生如下:
服务器有2008 R2,中央和边缘设备正在运行SQL CE。
中央同步和边缘设备从服务器获取其初始数据,但当时他们不知道它们将是什么。启动应用程序后,将确定其角色。因为我们必须在中央和边缘设备上禁用和重新启用跟踪以允许CE进行CE同步(无法找到任何其他方式来实现这项工作,因为它在我的评论中抛出了上述异常),它似乎搞乱了CE到SQL 2008同步,它提出了上述问题,即最初同步的数据被重新发送到服务器。这是通过手动设置发送的锚来解决的,但是CE对CE数据库的副作用是将初始数据相互传输,然后将其传输回服务器。
同步框架在尝试更新和插入行时确实将此视为冲突,但是尽管尝试通过多种方式设置冲突解决规则但它并未解决问题。然后,我们尝试在配置数据库之前擦除边缘设备中的数据,以便它可以从中央设备获取最新数据。这解决了这个问题。如上所述,这并不理想,但这是一个可行的解决方案。
如果您对如何解决此问题有任何想法,而无需擦除边缘设备,因为有必要进行边缘设备同步设置而无需重新加载在初始设置期间最初下载的所有数据
干杯。