相关疑难解决方法(0)

什么是SQL Server中的"with(nolock)"?

with (nolock)当你应该/不应该使用它时,有人可以解释使用查询的含义吗?

例如,如果您的银行应用程序具有较高的事务率和某些表中的大量数据,那么哪些类型的查询可以解决?是否应该经常使用它/从不使用它?

sql-server nolock

579
推荐指数
16
解决办法
63万
查看次数

NOLOCK提示在SELECT语句中的作用

我想真正的问题是:

如果我不关心脏读,将添加with(NOLOCK)提示到SELECT语句会影响性能:

  1. 当前的SELECT语句
  2. 针对给定表的其他事务

例:

Select * 
from aTable with (NOLOCK)
Run Code Online (Sandbox Code Playgroud)

sql sql-server locking

193
推荐指数
4
解决办法
33万
查看次数

在并发更新期间选择查询会跳过记录

我有由N个线程并发处理的表.

CREATE TABLE [dbo].[Jobs]
(
    [Id]                    BIGINT          NOT NULL    CONSTRAINT [PK_Jobs] PRIMARY KEY IDENTITY,
    [Data]                  VARBINARY(MAX)  NOT NULL,
    [CreationTimestamp]     DATETIME2(7)    NOT NULL,
    [Type]                  INT             NOT NULL,
    [ModificationTimestamp] DATETIME2(7)    NOT NULL,
    [State]                 INT             NOT NULL,
    [RowVersion]            ROWVERSION      NOT NULL,
    [Activity]              INT                 NULL,
    [Parent_Id]             BIGINT              NULL
)
GO

CREATE NONCLUSTERED INDEX [IX_Jobs_Type_State_RowVersion] ON [dbo].[Jobs]([Type], [State], [RowVersion] ASC) WHERE ([State] <> 100)
GO

CREATE NONCLUSTERED INDEX [IX_Jobs_Parent_Id_State] ON [dbo].[Jobs]([Parent_Id], [State] ASC)
GO
Run Code Online (Sandbox Code Playgroud)

作业正在添加到表中State=0 (New)- 它可以被此状态下的任何工作者使用.当worker获取此队列项时,State更改为,50 (Processing)并且其他使用者无法使用该作业(工作程序[dbo].[Jobs_GetFirstByType] …

t-sql sql-server concurrency locking sql-server-2008

14
推荐指数
1
解决办法
321
查看次数

SQLDataReader如何处理真正大的查询?

实际上我不确定标题是否准确描述了这个问题,但我希望它足够接近.

我有一些代码从数据库表执行SELECT,我知道这将导致大约150万行被选中.每行中的数据不大 - 每行可能20个字节.但这仍然是30MB的数据.每行包含一个客户编号,我需要为每个客户做一些事情.

我的代码看起来像:

SqlConnection conn = new SqlConnection(connString);
SqlCommand command = new SqlCommand("SELECT ... my select goes here", conn);
using (conn)
{
    conn.Open();
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while(reader.Read())
        {
            ... process the customer number here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我只是迭代SELECT返回的所有客户.

我的问题是,这会导致数据库的多次读取,还是只读取一次?我假设网络缓冲区不足以容纳30MB的数据,那么.NET在这里做什么呢?每次Read()推进指针时,SELECT的结果是否会让某些地方的SQLDataReader啃掉一行?还是回到数据库?

我问的原因是代码中的"...处理客户编号"部分可能需要一些时间,因此对于150万客户而言,代码(上面的while循环)将花费很多时间来完成.当发生这种情况时,我是否需要担心其他人在数据库上阻挡我,或者我知道我已经从数据库中完成了一个SELECT并且我不会再回来了吗?

c# sql

10
推荐指数
3
解决办法
6744
查看次数

标签 统计

sql-server ×3

locking ×2

sql ×2

c# ×1

concurrency ×1

nolock ×1

sql-server-2008 ×1

t-sql ×1