2011-06-13 107 views
6

现在我和一位同事争论非重要的BEGIN TRAN .... COMMIT TRAN块的影响。 我已经写了大约140个存储过程用于简单的插入 - 更新 - 删除操作,因为我们可能以后需要在它们中做一些额外的操作,所以我已经包含了可能必需的BEGIN TRAN和COMMIT TRAN块:事务块是否会降低SQL Server的性能?

CREATE PROCEDURE [Users].[Login_Insert] 

     @Username   nvarchar (50) OUTPUT, 
     @Password   char (40), 
     @FullName   nvarchar (150), 
     @LoginTypeId  int 

AS 

SET NOCOUNT ON; 

BEGIN TRY 
BEGIN TRAN 

INSERT [Users].[Login] 
(
     [Username], 
     [Password], 
     [FullName], 
     [LoginTypeId] 
) 
VALUES 
(
     @Username, 
     @Password, 
     @FullName, 
     @LoginTypeId 
) 

COMMIT TRAN 
RETURN 1 
END TRY 

BEGIN CATCH 
ROLLBACK TRAN 

RETURN -1 
END CATCH 

GO 

现在很多这些交易可能永远不需要。这些无关块是否会以显着的方式影响性能? 在此先感谢。

回答

8

不足以注意。

也就是说,每个TXN将在BEGIN TRAN和INSERT之间开放一个额外的OhNoSecond。如果有人能够衡量它,我会留下深刻的印象。

但是,如果你做了BEGIN TRAN然后提示用户输入,你的腿断需要...

很好,尽管我这样做,所以我所有的写特效是100%一致,具有相同的错误处理,可以嵌套等

编辑:瑞摩斯之后的回答,我看我没有链接到我的窝TXN模板:Nested stored procedures containing TRY CATCH ROLLBACK pattern?这是莱姆斯不同的,因为它总是回滚,也没有保存点

编辑,一项快速而肮脏的测试显示,在交易时间约2/3的情况下,它更快速。

SET NOCOUNT ON 
SET STATISTICS IO OFF 

DECLARE @date DATETIME2 
DECLARE @noTran INT 
DECLARE @withTran INT 

SET @noTran = 0 
SET @withTran = 0 

DECLARE @t TABLE (ColA INT) 
INSERT @t VALUES (1) 

DECLARE 
    @count INT, 
    @value INT 

SET @count = 1 

WHILE @count < 100 
BEGIN 

    SET @date = GETDATE() 
    UPDATE smalltable SET smalltablename = CASE smalltablename WHEN 'test1' THEN 'test' ELSE 'test2' END WHERE smalltableid = 1 
    SET @noTran = @noTran + DATEDIFF(MICROSECOND, @date, GETDATE()) 

    SET @date = GETDATE() 
    BEGIN TRAN 
    UPDATE smalltable SET smalltablename = CASE smalltablename WHEN 'test1' THEN 'test' ELSE 'test2' END WHERE smalltableid = 1 
    COMMIT TRAN 
    SET @withTran = @withTran + DATEDIFF(MICROSECOND, @date, GETDATE()) 

    SET @count = @count + 1 
END 

SELECT 
    @noTran/1000000. AS Seconds_NoTransaction, 
    @withTran/1000000. AS Seconds_WithTransaction 

Seconds_NoTransaction Seconds_WithTransaction 
2.63200000    2.70400000 
2.16700000    2.12300000 

逆转更新的顺序保持相同的行为

+2

我试着测量一次,不能。没有可衡量的影响。 – 2011-06-13 19:02:46

+0

希望我的同事能够看到这个结论。非常感谢朋友 – M2X 2011-06-13 19:02:58

+0

[答案在这里说,它是可衡量的](http://stackoverflow.com/questions/3201982/having-transaction-in-all-queries/3273661#3273661) – 2011-06-14 05:59:31

5

在您发布不会有明显的影响的代码,但交易确实有对性能的影响,他们可以显着改善因性能登录提交刷新分组或者由于错误管理的争用问题,他们可能会显着降低性能。但底线是当交易需要正确性时,您不能跳过。话虽如此,但您的模板对于交易和try-catch块来说确实相当糟糕。 catch块中的transcation必须具有返回值(-1,0,1)的三态逻辑检查XACT_STATE并正确处理注定事务。例如,请参阅Exception handling and nested transactions

此外,你永远不应该混用try-catch错误处理和返回码错误处理。挑一个并坚持下去,最好试试。换句话说,你的存储过程应该是RAISE,而不是返回-1。将异常与错误代码混合在一起会使您的代码成为噩梦来维护和正确调用。

+0

,您的其他链接速度会更快。我真的很高兴您提到它。谢谢你的repsonse – M2X 2011-06-13 20:30:25

相关问题