sql – 数据库事务仅部分提交

我有一个在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不会.最初我们认为可能是UPDATE上的WHERE子句没有匹配任何东西,所以我们添加了IF @@ rowcount逻辑.但即使有那些检查,INSERT仍在发生,程序仍在完成并返回0. 我正在寻找可能导致此类问题的想法.有没有关于SQL事务的工作方式,或Sybase的具体工作方式,可能导致COMMIT不提交所有内容?我的IF块有什么东西可以让UPDATE除了程序之外什么都不匹配?还有其他想法吗?

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

点赞