【问题标题】:How to be certain that I've read all of my SQL output before a transaction is committed?如何确定在事务提交之前我已经阅读了所有的 SQL 输出?
【发布时间】:2013-01-15 20:18:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql-server vb.net tsql


    【解决方案1】:

    这种方法无法确定。

    我会建议这样的东西。

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

    2. 将暂存表内容输出到应用程序

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

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

    【讨论】:

      【解决方案2】:

      崩溃 DataReader 看看。

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

      选项 A - 霍根 - 好答案

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-08
        • 2021-12-13
        • 2019-07-20
        • 2011-02-22
        • 1970-01-01
        • 2014-02-15
        • 2015-05-30
        • 2013-05-31
        相关资源
        最近更新 更多