数据库事务只能部分提交
-
22-09-2019 - |
题
我已经得到了有时未能提交其所有操作的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不走。本来我们认为这可能是对WHERE
s的UPDATE
的条款没有任何匹配,所以我们增加了IF @@rowcount
逻辑。但是,即使在那里这些检查,则INSERT
仍然发生,该过程仍然完成并返回0。
我在寻找什么可能会导致这类问题的想法。有没有关于方式SQL交易工作,或Sybase具体工作的方式什么,那可能会造成COMMIT
不要犯的一切吗?是否有一些关于我的IF
块,可以允许更新不匹配任何东西,但继续手术?任何其他的想法?
解决方案
时,可能的是,它们是更新的事,但在改变的值回?尝试对这些表和触发器插入到日志表中增加一个更新触发器。对于出现在日志中没有更新的样子行,有行不?
其他提示
不知道你是如何为您的变量的值,它发生,我认为如果@ NEW_VALUE1是相同FIELD1先前值的值时,更新会成功,但似乎没有改变任何东西让你觉得该事务没有发生。
您也可以有正影响着更新的触发器。
不隶属于 StackOverflow