lui*_*gig 16 sql sql-server transactions rowversion data-synchronization
我们正在通过链接的服务器连接在两个SQL Server数据库之间,在单独的服务器(SQL Server 2008 Enterprise 64位SP2 - 10.0.4000.0)中对一种Sync Framework进行故障排除,并且我们达到了排序的程度卡住了.
识别哪些是"待同步"的记录的逻辑当然基于ROWVERSION值,包括使用MIN_ACTIVE_ROWVERSION()以避免脏读.
所有SELECT操作都封装在每个"源"端的SP中.这是一个SP的示意图:
PROCEDURE LoaderRetrieve(@LastStamp bigint, @Rows int)
BEGIN
...
(vars handling)
...
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Select TOP (@Rows) Field1, Field2, Field3
FROM Table
WHERE [RowVersion] > @LastStampAsRowVersionDataType
AND [RowVersion] < @MinActiveVersion
Order by [RowVersion]
END
Run Code Online (Sandbox Code Playgroud)
该方法工作正常,我们通常以预期的600k /小时速率同步记录(每30秒一次作业,批量大小= 5k),但在某些时候,同步过程找不到任何单个记录要传输,即使有数千条记录的ROWVERSION值大于@LastStamp参数.
在检查原因时,我们发现搜索MIN_ACTIVE_ROWVERSION()的值小于(或稍微大一些,只有5或10个增量)@LastStamp.这当然应该不是问题,因为MIN_ACTIVE_ROWVERSION()引入该方法是为了避免脏读和后验问题,但是:
在上述情况发生期间,我们在某些情况下看到的问题是,MIN_ACTIVE_ROWVERSION()在很长(很长)的时间段内,例如30/40分钟,有时超过一小时,价值不会发生变化.而这个值远远低于该@@DBTS值.
我们首先认为这与尚未提交的待处理数据库事务有关.根据MSDN关于MIN_ACTIVE_ROWVERSION()(链接)的定义:
返回当前数据库中最低的活动rowversion值.如果在尚未提交的事务中使用rowversion值,则该rowversion值处于活动状态.
但是当在此问题期间检查sessions(sys.sysprocesses)open_tran > 0时,我们找不到任何等待时间大于几秒的会话,只有一到两次+/- 5分钟的等待时间会话.
所以在这一点上我们正在努力理解这种情况:MIN_ACTIVE_ROWVERSION()在很长一段时间内没有改变,并且在这段时间内没有找到长时间等待的未提交的交易.
我不是DBA,可能是因为我们在图片中遗漏了一些东西来分析这个问题,在论坛和博客上做一些研究都找不到任何其他线索.到目前为止open_tran> 0是正当理由,但在我暴露的情况下,很明显还有别的东西,不知道为什么.
任何反馈都表示赞赏.
好吧,我终于在挖了一点之后找到了解决方案.
问题是我们正在寻找具有较长等待时间的会话,但真正的目标是找到一段时间内具有活动批处理的会话.
如果有一个open_tran = 1的会话,要准确获取此事务打开时(当然仍然是活动的,尚未提交),sys.sysprocesses应检查字段last_batch from .
使用此查询:
select
batchDurationMin= DATEDIFF(second,last_batch,getutcdate())/60.0,
batchDurationSecs= DATEDIFF(second,last_batch,getutcdate()),
hostname,open_tran,* from sys.sysprocesses a
where spid > 50
and a.open_tran >0
order by last_batch asc
Run Code Online (Sandbox Code Playgroud)
我们可以确定一个会话,其中open tran活跃30分钟以上.通过主机名值和Web服务中的一些检查(以及使用dbcc inputbuffer),我们找到了负责任的流程.
所以,最后一个问题实际上是"确实存在与未提交事务的活动会话",因此MIN_ACTIVE_ROWVERSION()不会改变.我们只是用错误的标准来查看流程.
现在我们知道哪个进程表现得像这样,下一步就是改进它.
希望这个结果对其他人有用.
| 归档时间: |
|
| 查看次数: |
1416 次 |
| 最近记录: |