现在我和一位同事正在争论非重要的BEGIN TRAN …… COMMIT TRAN块的影响.
我已经为简单的插入更新删除操作写了大约140个存储过程,因为我们以后可能需要在它们中做一些额外的操作,我已经包含了可能是必要的BEGIN TRAN和COMMIT TRAN块,如下所示:
我已经为简单的插入更新删除操作写了大约140个存储过程,因为我们以后可能需要在它们中做一些额外的操作,我已经包含了可能是必要的BEGIN TRAN和COMMIT TRAN块,如下所示:
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
现在许多这些交易可能永远不必要.这些无关的块是否会以明显的方式影响性能?
提前致谢.
解决方法
不足以引起注意.
也就是说,每个TXN将在BEGIN TRAN和INSERT之间打开额外的OhNoSecond.如果有人能测量它,我会留下深刻的印象.
但是,如果你做BEGIN TRAN然后提示用户输入,你的腿需要打破……
好主意:我这样做所以我的所有写入过程100%一致,具有相同的错误处理,可以嵌套等
编辑:在Remus的回答之后,我看到我没有链接到我的嵌套TXN模板:Nested stored procedures containing TRY CATCH ROLLBACK pattern?这与Remus的不同之处在于它总是回滚并且没有SAVEPOINTs
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,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
颠倒更新顺序会保持相同的行为