我在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除了继续的过程之外什么都不匹配?还有其他想法吗?
答案 0 :(得分:1)
可能是他们正在更新,但有些东西正在改变这些值?尝试在这些表上添加更新触发器,并在该触发器插入日志表中。对于看似未更新的行,请查看日志,是否有行?
答案 1 :(得分:1)
不知道你如何设置变量的值,我发现如果@ NEW_VALUE1的值与FIELD1中的前一个值相同,则更新会成功,但似乎没有改变任何让你思考的东西交易没有发生。
您还可能有一个影响更新的触发器。