如果对同一个大型表的多个查询同时进入SQL Server,那么SQL Server如何解决这种情况下的冲突?
在WPF应用程序中使用LINQ to SQL查询在许多PC上安装时,在使用SQL Server数据库的网络中工作时,我是否应该以某种方式实现解决此类问题的机制,或者我是否受到SQL Server和LINQ的此类问题的保护SQL?
(我不是指同一个记录的并发操作,它通过使用TIMESTAMP字段解决。我的意思是一些队列问题,当从多个网络站查询相同的大表时)
答案 0 :(得分:3)
如果您的查询导致死锁,SQL Server有一个内部机制来处理它。
如果它检测到死锁情况,则选择要回滚的“受害者”事务。选择受害者的方式首先基于事务的优先级设置,然后基于回滚每个查询的总成本。回滚成本较低的通常是受害者。
您实际上可以使用SET DEADLOCK_PRIORITY
来控制优先级(LOW,MEDIUM或HIGH,或介于-10和10之间的数字)。如果您发现自己处于这种情况,那么您应该首先努力减少死锁。
答案 1 :(得分:3)
SQL Server将管理每个连接的连接和查询执行,您无法控制何时,何时,谁来查询。
您可以通过确保具有正确的索引来控制查询所花费的时间,但这就是您的关注点。
答案 2 :(得分:2)
数据库使用隔离级别来解决您所询问的问题。
当您需要隔离事务的资源并保护该资源免受其他事务处理时,隔离级别就会发挥作用。通过获取锁来完成保护。需要设置哪些锁以及如何为事务建立锁是由SQL Server参考已设置的隔离级别确定的。较低的隔离级别允许多个用户同时访问资源(并发),但它们可能会引入与并发相关的问题,例如脏读和数据不准确。较高的隔离级别消除了与并发相关的问题并提高了数据准确性,但它们可能会引入阻塞。
有关SQL Server 2005隔离级别的更多信息,请阅读this article。
您可以调整隔离级别,即使是基于每个查询。但它的先进原则确实会导致问题。