如何确定在提交事务之前我已经读取了所有SQL输出?

时间:2013-01-15 20:19:00

标签: sql-server vb.net tsql

我有一张桌子,从中我经常想要所有的数据(这是一个由另一个程序填充的缓冲区)。我也希望一旦读完就将这些数据从表中删除。所以我有类似

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

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

是否有更好的方法可以做到这一点?我有一个程序,它不断地将一个记录一个接一个地写入此表,我希望这个程序进入并获得它。我正在一把手抓住它,所以我可以使用DELETE - OUTPUT DELETED,而不是更昂贵的一系列“删除where”子句。我更喜欢作家和读者都可以不间断地继续前进的方式。

2 个答案:

答案 0 :(得分:3)

这种方法无法确定。

我会建议这样的事情。

  1. 将要删除的记录移至登台表。

  2. 将登台表内容输出到应用程序

  3. 从申请中确认已处理内容。

  4. 从登台表中删除内容。

答案 1 :(得分:0)

崩溃DataReader并查看。

你能使用MSMQ而不是SQL吗?

选项A - 霍根 - 好的答案

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

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

中的ID