0

我有一个表,我一直想要从中获取所有数据(它是一个由另一个程序填充的缓冲区)。我还希望在阅读完这些数据后将其从表中删除。所以我有类似的东西

BEGIN TRANS T1;
DELETE FROM table_name OUTPUT DELETED.*;
COMMIT TRANS T1;

在阅读器程序中,我使用 DataReader 循环遍历每一行。我担心的是,如果在读取这些数据时出现问题怎么办?比如说,线程崩溃了,我只读取了部分数据。如果这是一个事务,它是在什么时候提交的?我什么时候开始读?我宁愿暂时不要锁定这个表,因为有另一个程序总是试图写入它。

有没有更好的方法来做到这一点?我有一个程序不断地向这个表中写入一条又一条记录,我希望这个程序进入并获取它。我一次把它全部抓起来,这样我就可以使用 DELETE - OUTPUT DELETED,而不是一系列成本更高的“delete where”子句。我更喜欢作者和读者都可以不受干扰的方式。

4

2 回答 2

3

这种方法无法确定。

我会建议这样的事情。

  1. 将要删除的记录移动到临时表。

  2. 将临时表内容输出到应用程序

  3. 从应用程序获取内容已处理的确认。

  4. 从暂存表中删除内容。

于 2013-01-15T20:21:51.040 回答
0

使 DataReader 崩溃并查看。

你可以使用 MSMQ 而不是 SQL 吗?

选项 A - 霍根 - 好答案

选项 B
有 PK 吗?
在哪里删除真的太昂贵了吗?
它摆脱了交易的需要。

选项 C
将 X(如 1000)的块(顶部)读入 .NET 集合而不是另一个表。删除 where ID in (....)

于 2013-01-15T22:46:56.660 回答