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