我的SQL事务花了太长时间吗?

时间:2017-02-02 07:57:11

标签: c# sql-server transactions

有些事让我担心我的申请。我有一个SQL查询,它在各种表中对数据库进行了大量插入。我计算完成这个过程需要多长时间,大约需要1.5秒。在这一点上,我甚至没有完成查询的开发,我还有更多的插入程序来编程。所以我完全期望这个过程需要更长的时间,最多可能需要3秒钟。

现在,重要的是所有这些数据都要保持一致并完全完成,或者根本不完成。所以我想知道的是,交易是否可以花那么长时间。它是否锁定表,因此选择,插入,更新等...在事务完成之前无法运行?我担心的是,如果这个查询经常运行,它可能会锁定整个应用程序,使其某些部分变得极其缓慢或无法使用。由于用户群较少,我怀疑这是一个问题,但如果我的应用程序应该获得一些牵引力,那么这个查询可能会有很多。

我是否应该关注这个问题,或者我错过了数据库不会影响我的想法的东西。我正在使用SQL Server 2014数据库。

要注意,我通过在事务开始之前立即使用StopWatch C#对象来计时,并在提交更改后立即停止它。所以它尽可能准确。

2 个答案:

答案 0 :(得分:1)

你关心这一点是正确的,因为事务会锁定它写入的行直到事务提交,这肯定会导致诸如死锁和临时阻塞之类的问题,这会使系统变慢响应。但是有各种因素决定了潜在的影响 例如,如果您的用户仅更新和查询自己的数据,并且您的表具有索引以支持读取和写入查询条件,您可能很大程度上不必担心。这样,每个用户的行锁定在很大程度上不会影响其他用户 - 具体取决于您编写代码的方式。
如果您的用户共享数据,并且您希望能够支持跨多个用户数据的高效搜索,例如,即使有多个并发更新,那么您可能需要执行更多操作。

一些一般概念:
- 确保您的交易以相同的顺序写入表格 - 在开始交易之前,尽可能准备要写入的数据,以使交易尽可能短 - 如果这是一个新系统(即使不是新系统),请务必考虑在数据库上启用快照隔离和/或读取提交快照隔离。 SI将(在会话中明确设置时)允许您的读取查询不被并发写入阻止。 RCSI将允许所有读取查询默认不被并发写入阻止。但阅读本文以了解两种隔离级别的好处和难点:https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/

答案 1 :(得分:0)

我认为它取决于你的代码,你如何有效地使用循环,选择查询和其他声明。