SQL Server:分布式事务和重复行
我有一个核心SQL Server和许多将数据传输到核心服务器的辅助SQL Server 每个辅助SQL Server都有链接的核心服务器和不时运行的存储过程 这是存储过程中的代码(删除了一些字段,但并不重要) 有两个表:SQL Server:分布式事务和重复行,sql,sql-server,tsql,transactions,distributed-transactions,Sql,Sql Server,Tsql,Transactions,Distributed Transactions,我有一个核心SQL Server和许多将数据传输到核心服务器的辅助SQL Server 每个辅助SQL Server都有链接的核心服务器和不时运行的存储过程 这是存储过程中的代码(删除了一些字段,但并不重要) 有两个表:Receipts有许多receiptGoodsString(keyReceiptID) 很好用。但有时在核心服务器上,Receipts和receiptGoodsString中有重复的行。这种情况很少发生,我不明白为什么 也许我选择了错误的数据传输方式 这似乎是一个并发问题 可能有
Receipts
有许多receiptGoodsString
(keyReceiptID
)
很好用。但有时在核心服务器上,Receipts
和receiptGoodsString
中有重复的行。这种情况很少发生,我不明白为什么
也许我选择了错误的数据传输方式 这似乎是一个并发问题 可能有两个并发事务打开,并且都从您的
收据
表中读取。每个会话都将写入自己的临时表(#Receipts
和#receiptGoodsString
)。最后,客户机间歇地锁定[SyncServer].[POSServer].[dbo].[Receipt]
和[SyncServer].[POSServer].[dbo].[ReceiptGoodsStrings]
以将临时表中的行填充到目标,并执行更新
因此,两个事务都成功完成,并且您有重复的行
幸运的是,您可以在第一个select fromReceipt
表中使用UPDLOCK hint来锁定在事务中已经读取的行/页。另一个客户端必须等待执行COMMIT
的第一个客户端释放锁。然后,第二个将继续,只读取要传输的新行并复制它们,并且只复制它们
SELECT TOP (@ReceiptsQuantity)
MarketId, CashCheckoutId, ReceiptId, GlobalReceiptId
INTO #Receipts
FROM dbo.Receipt WITH (UPDLOCK)
WHERE Transmitted = 0
编辑
最后,请注意调用同步事务的时间间隔。可能是时间间隔太短,因此在新事务开始时,事务尚未完成。在这种情况下,您可以期望得到重复的行,因为。你可以试着增加间隔
SELECT TOP (@ReceiptsQuantity)
MarketId, CashCheckoutId, ReceiptId, GlobalReceiptId
INTO #Receipts
FROM dbo.Receipt WITH (UPDLOCK)
WHERE Transmitted = 0