数据库事务只是部分提交

时间:2009-09-09 14:17:29

标签: sql database tsql error-handling sybase-ase

我在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,但两个UPDATE不会。最初我们认为WHERE上的UPDATE条款可能与任何内容都不匹配,因此我们添加了IF @@rowcount逻辑。但即使有那些检查,INSERT仍在进行,程序仍在完成并返回0。

我正在寻找可能导致此类问题的想法。有没有关于SQL事务的工作方式,或Sybase的具体工作方式,可能导致COMMIT不提交所有内容?我的IF块有什么东西可以让UPDATE除了继续的过程之外什么都不匹配?还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

不知道你如何设置变量的值,我发现如果@ NEW_VALUE1的值与FIELD1中的前一个值相同,则更新会成功,但似乎没有改变任何让你思考的东西交易没有发生。

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