4

我有一个在 Sybase ASE 数据库服务器上运行的 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语句提交。proc 完成并返回 0,但两个UPDATEs 不占用。最初我们认为可能是sWHERE上的子句UPDATE不匹配,所以我们添加了IF @@rowcount逻辑。但即使有这些检查,仍然在INSERT发生,程序仍在完成并返回 0。

我正在寻找可能导致此类问题的想法。SQL 事务的工作方式或 Sybase 的具体工作方式是否有任何可能导致COMMIT不提交所有内容的内容?我的IF块是否有一些东西可以让 UPDATE 不匹配任何东西,但过程继续?还有其他想法吗?

4

2 回答 2

1

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

于 2009-09-09T14:28:03.293 回答
1

不知道您如何设置变量的值,我突然想到,如果 @NEW_VALUE1 的值与 FIELD1 中的先前值相同,则更新将成功,但似乎没有改变任何使您认为交易有没有发生。

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

于 2009-09-09T14:31:10.137 回答