【问题标题】:SQL begin transaction with no commitSQL 开始没有提交的事务
【发布时间】:2011-08-23 06:51:31
【问题描述】:

如果我开始一个事务,但从未调用 COMMIT。数据会发生什么? 我有一个较小的数据库(比如一百万左右的 SKU)。我以 1024 的偶数小块导出它。(第三方限制限制了我的文件大小)。
我必须标记已导出的记录..

例如。更新产品集exported = 1 where sku = '1234';

现在我每隔一段时间就会遇到一个导致第三方文件写入工具崩溃的问题。 但这发生在给定记录的文件创建之前。

所以我在考虑是否在更新记录之前调用 begin transaction,并且仅在我确认文件已构建后才提交。

这可能会导致一些没有孪生的开始事务。

所以两个问题.. 有更好的方法吗? (除了摆脱有问题的第三方) 或者作为从未提交的事务的一部分的记录会发生什么?

【问题讨论】:

    标签: sql-server-2008 transactions


    【解决方案1】:

    在连接完全关闭(不仅仅是返回连接池)之前,您的事务会在锁定状态下保持打开状态。这很糟糕

    要在没有显式事务的情况下执行 UPDATE 并管理 1024 行块,请执行以下操作

    UPDATE TOP (1024)
       Products
    SET
       exported = 1
    OUTPUT
       INSERTED.*
    WHERE
       exported = 0;
    

    您可以修改它以使用具有“正在处理”“已导出”等的状态列,以便您知道何时读取了内容但未导出

    【讨论】:

    • 唯一的问题是我不知道我已经导出了一条记录,直到文件被写入。我想我可以创建一个“已声明”表,然后在最后一个阶段将数据从已声明推送到 HD。感谢您提供有关交易的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2016-08-21
    相关资源
    最近更新 更多