代码之家  ›  专栏  ›  技术社区  ›  John M Gant aman_novice

数据库事务仅部分提交

  •  4
  • John M Gant aman_novice  · 技术社区  · 16 年前

    我在SybaseASE数据库服务器上运行了一个T-SQL存储过程,它有时无法提交它的所有操作,即使它无一例外地完成了。下面是一个大致的例子。

    BEGIN TRANSACTION
    
    UPDATE TABLE1
    SET FIELD1 = @NEW_VALUE1
    WHERE KEY1 = @KEY_VALUE1
    
    IF @@error <> 0 OR @@rowcount <> 1 BEGIN
        ROLLBACK
        RETURN 1
    END
    
    UPDATE TABLE2
    SET FIELD2 = @NEW_VALUE2
    WHERE KEY2 = @KEY_VALUE2
    
    IF @@error <> 0 OR @@rowcount <> 1 BEGIN
        ROLLBACK
        RETURN 2
    END
    
    INSERT TABLE2 (FIELD2, FIELD3)
    VALUES (@NEW_VALUE3a, @NEW_VALUE3b)
    
    IF @@error <> 0 OR @@rowcount <> 1 BEGIN
        ROLLBACK
        RETURN 3
    END
    
    COMMIT TRANSACTION
    RETURN 0
    

    这个过程每天至少要调用数百次。在这些案例中的一小部分(可能是3%),只有 INSERT 语句提交。过程完成并返回0,但两个 UPDATE 不要拿。最初我们认为 WHERE 有关条款 更新 没有匹配任何内容,因此我们添加了 IF @@rowcount 逻辑。但即使有那些支票, 插入 仍在发生,过程仍在完成并返回0。

    我正在寻找可能导致这类问题的原因。SQL事务的工作方式,或者Sybase的具体工作方式,是否会导致 COMMIT 不承诺一切?有什么关于我的 IF 允许更新不匹配任何内容的块是否继续?还有其他想法吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   KM.    16 年前

    是否有可能他们正在更新,但有什么东西正在改变这些值?尝试在这些表中添加一个更新触发器,并在该触发器中插入到一个日志表中。对于似乎尚未更新的行,请查看日志中是否有行?

        2
  •  1
  •   HLGEM    16 年前

    不知道如何为变量设置值,我突然想到,如果@new_value1的值与field1中的前一个值相同,更新将成功,但似乎没有更改任何使您认为事务没有发生的内容。

    您还可以有一个影响更新的触发器。

    推荐文章