提交事务时间过长?

5

我有一个存储过程,其中包含以下代码:

BEGIN TRY
--BEGIN TRANSACTION @TranName

    DECLARE @ID int

    INSERT INTO [dbo].[a] ([Comment],[Type_Id],[CreatedBy])
    VALUES ('test',1,2)

    SET @ID = SCOPE_IDENTITY()

    INSERT INTO [dbo].[b] ([Can_ID],[Com_ID],[Cal_ID],[CreatedBy])
    VALUES (1,@ID,null,2)

    UPDATE c SET LastUpdated = GETDATE(), LastUpdatedBy = 2 WHERE b.id = @ID

    --COMMIT TRANSACTION @TranName

    SELECT * from [View] where a.id=@ID
    END TRY
    BEGIN CATCH
--ROLLBACK TRANSACTION @TranName
END CATCH

每个语句单独运行时(如现在所示),都会运行得很快。但是,当我们从事务代码中删除注释后,脚本的运行时间从1秒增加到2分钟以上。
系统已经运行了一段时间,之前没有这个问题,我一直在试图搜索关于SQL Server如何处理事务的文档,以防有任何可能影响SQL性能的因素,我想到的唯一一件事就是事务日志...但理想情况下,每个语句也应该在单独的事务中运行,有什么想法吗?

3
这似乎是一个锁定问题。将所有这些操作运行在一个事务中会导致您的会话在表a、b和c上保持锁定的时间比不使用事务运行时要长得多。您应该检查运行期间服务器上的锁定和等待情况。 - Jens
2
运行您的查询并在单独的窗口中运行此 DMV,然后将输出粘贴到问题中。 从 sys.dm_exec_requests ec cross apply sys.dm_exec_sql_text (ec.sql_handle) txt cross apply sys.dm_exec_query_plan(ec.plan_handle) pln 选择 ec.blocking_session_id、ec.wait_type、ec.last_Wait_type、txt.text 和 pln.query_plan。 - TheGameiswar
谢谢你们,我会尽快检查的。目前我没有足够的权限来运行这些查询,一旦我可以运行它们,我会告诉你们输出结果的情况 :) - Noe
这是一个伪造的脚本,UPDATESELECT行不应该起作用。请提供填充表A、B、C的代码以及您的**[View]**的代码。 - Slava Murygin
脚本是原始脚本的副本,我只是修改了列并添加了一些虚拟数据。Slava,原始表和视图太大了,无法直接复制粘贴到这里。我担心的不是我选择/更新/插入的数据,而是当我将它们包围在事务中时,脚本的执行时间会大大增加。我认为可能有一个锁定的地方,就像Jens所建议的那样。 - Noe
像@Jens建议的那样,似乎与锁定资源有关,我重置了SQL Server服务,一切似乎又正常了。下次我会尝试监视哪些其他进程正在锁定表。干杯,伙计们! - Noe
1个回答

3
正如Jens所建议的那样,问题是由于一些表格阻塞导致的,在重置SQL Server服务后这些锁定消失,数据库再次正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接