在存储过程中BEGIN TRAN和COMMIT TRAN

时间:2012-09-05 17:41:11

标签: sql-server sql-server-2008 tsql stored-procedures transactions

我有一个如下所示的程序

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封装?

3 个答案:

答案 0 :(得分:1)

是的,如果你想要原子性,你需要使用一个交易。

答案 1 :(得分:1)

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

但是BEGIN / END TRAN将保证UPDATE语句都被执行或两者都没有。

答案 2 :(得分:1)

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