我已经得到了有时未能提交其所有操作的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,但两个UPDATEs不走。本来我们认为这可能是对WHEREs的UPDATE的条款没有任何匹配,所以我们增加了IF @@rowcount逻辑。但是,即使在那里这些检查,则INSERT仍然发生,该过程仍然完成并返回0。

我在寻找什么可能会导致这类问题的想法。有没有关于方式SQL交易工作,或Sybase具体工作的方式什么,那可能会造成COMMIT不要犯的一切吗?是否有一些关于我的IF块,可以允许更新不匹配任何东西,但继续手术?任何其他的想法?

有帮助吗?

解决方案

时,可能的是,它们是更新的事,但在改变的值回?尝试对这些表和触发器插入到日志表中增加一个更新触发器。对于出现在日志中没有更新的样子行,有行不?

其他提示

不知道你是如何为您的变量的值,它发生,我认为如果@ NEW_VALUE1是相同FIELD1先前值的值时,更新会成功,但似乎没有改变任何东西让你觉得该事务没有发生。

您也可以有正影响着更新的触发器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top