1

我有一个如下所示的程序

BEGIN
    SET NOCOUNT ON

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'X')
        UPDATE TABLE X 
        SET ROW = 4
        WHERE NAME = 'STEVE'

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Y')
        UPDATE TABLE Y
        SET ROW = 5
        WHERE NAME = 'ART'
END

如果我希望以原子性评估两个 IF 语句,是否需要添加 BEGIN TRAN 和 COMMIT TRAN 封装?

4

3 回答 3

1

是的,如果您想要原子性,您将需要使用事务。

于 2012-09-05T17:50:33.010 回答
1

使用 BEGIN/END TRAN 不能保证两个 IF 语句都被评估。如果第一个 SELECT/UPDATE 因错误而失败,则可能不会执行第二个 SELECT/UPDATE。

但是 BEGIN/END TRAN 将保证两个 UPDATE 语句都被执行或都不执行。

于 2012-09-05T18:12:48.603 回答
1

我认为您可能会遇到更深层次的问题 - 如果表 X 不存在,那么该过程将无法编译,因为您在 UPDATE 中有对它的引用

于 2012-09-05T18:33:06.647 回答