Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:分布式事务和重复行_Sql_Sql Server_Tsql_Transactions_Distributed Transactions - Fatal编程技术网

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中有重复的行。这种情况很少发生,我不明白为什么 也许我选择了错误的数据传输方式 这似乎是一个并发问题 可能有

我有一个核心SQL Server和许多将数据传输到核心服务器的辅助SQL Server

每个辅助SQL Server都有链接的核心服务器和不时运行的存储过程

这是存储过程中的代码(删除了一些字段,但并不重要)

有两个表:
Receipts
有许多
receiptGoodsString
(key
ReceiptID

很好用。但有时在核心服务器上,
Receipts
receiptGoodsString
中有重复的行。这种情况很少发生,我不明白为什么


也许我选择了错误的数据传输方式

这似乎是一个并发问题

可能有两个并发事务打开,并且都从您的
收据
表中读取。每个会话都将写入自己的临时表(
#Receipts
#receiptGoodsString
)。最后,客户机间歇地锁定
[SyncServer].[POSServer].[dbo].[Receipt]
[SyncServer].[POSServer].[dbo].[ReceiptGoodsStrings]
以将临时表中的行填充到目标,并执行更新

因此,两个事务都成功完成,并且您有重复的行

幸运的是,您可以在第一个select from
Receipt
表中使用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