确定自SQL Server上次访问以来的行更改

dna*_*oli 4 sql sql-server concurrency database-design

我们有一个多用户系统,用户可以保存到中央SQL Server 2005数据库.我们遇到了一个问题,即用户刷新db中的更改而另一个用户保存新数据.我们当前收集更改的方式是每个表上都有一个时间戳列,每列都插入/更新.另一个用户将在客户端上存储时间戳,这是他最后一次从数据库中取出时间.

每次保存都在事务中完成.我们正在处理的例子如下:

  • User1启动保存,打开事务并插入/修改行,更改其时间戳.
  • 在User1提交更改之前,User2从数据库刷新,从而以某种方式导致User2的时间戳更新.
  • 用户1提交事务和所有更改.
  • User2再次刷新数据库,但是因为他的时间戳先前已更新,只有User1提交的更改的后半部分被拉入并导致错误和应用程序崩溃.

这使我们认为时间戳不一定是用于确定自前端系统上次访问以来数据库更改的最佳方法.什么是更好的解决方案?

进一步的例子

  • User1启动保存,打开事务并插入/修改行并更新其时间戳.
  • User2启动另一个保存,打开一个事务,插入/修改更新其时间戳的OTHER行,并提交他的事务.
  • User3从数据库刷新并下拉User2提交的所有数据,将其LastRefreshTimestamp更新为User2在db中创建的最后一个时间戳.
  • User1提交他的交易.
  • 用户3再次从数据库刷新,但是在User2的事务结束和User1的事务结束之间根据其LastRefreshTimestamp撤消所有更改,在User2的事务开始之前错过User1的事务所提交的所有更改.

Tao*_*Tao 8

有趣的问题,我想不出一个简单干净的基于T-SQL的解决方案,但这正是SQL 2008中的Change Tracking创建的同步挑战类型... http://msdn.microsoft.com /en-us/library/bb933875.aspx

本博客/文章中对变更跟踪与变更数据捕获的非常高级概述:http://blogs.technet.com/b/josebda/archive/2009/03/24/sql-server-2008-change-跟踪-CT-和更改数据捕获,cdc.aspx

如果您的一般目标是保留存储库的客户端副本,则可以将此与Microsoft Sync Framework结合使用:http://msdn.microsoft.com/en-us/sync/bb887608