相关疑难解决方法(0)

了解SELECT查询的SQL Server LOCKS

我想知道SELECT WITH (NOLOCK)如果影响该表的唯一其他查询是SELECT查询,在表上使用的好处是什么.

这是如何由SQL Server处理的?将一个SELECT查询块另一个SELECT查询?

我正在使用SQL Server 2012和Linq-to-SQL DataContext.

(编辑)

关于表现:

  • 如果使用锁定,第二个SELECT必须等待第一个SELECT完成SELECT吗?
  • 对比SELECT WITH (NOLOCK)

t-sql sql-server linq-to-sql

72
推荐指数
4
解决办法
14万
查看次数

与(nolock)或(nolock) - 有区别吗?

一切都基于这样的假设,即(nolock)完全适合于这种情况.已经有很多问题争论是否与(nolock)一起使用.

我环顾四周,无法找到使用之间是否存在实际差异with(nolock):

select customer, zipcode from customers c with(nolock) 
Run Code Online (Sandbox Code Playgroud)

或者只是(nolock):

select customer, zipcode from customers c (nolock) 
Run Code Online (Sandbox Code Playgroud)

这两者之间是否存在功能差异?文体?
一个比另一个年长,有可能被弃用吗?

sql sql-server select nolock sql-server-2008-r2

42
推荐指数
3
解决办法
5万
查看次数

目前,我的所有SQL请求显示"System.ComponentModel.Win32Exception:等待操作超时"

突然,所有sql server请求显示"System.ComponentModel.Win32Exception:等待操作超时".找到问题的最快方法是什么?

Stack Trace: 


[Win32Exception (0x80004005): The wait operation timed out]

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1767866
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5352418
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1691
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2012

11
推荐指数
1
解决办法
4万
查看次数

存储过程在DB中有效,但在C#代码中无效

我有一个存储过程,它有3个输入参数.Id和2个VarChar条件.当我执行存储过程的干运行时,它工作正常,但是当我从C#代码调用相同的存储过程时,它会失败.我传递的完全相同的参数,我在存储过程的干运行中使用,但存储过程保持挂起.

这有什么理由发生吗?

我正在使用SQL Server 2008 R2快速版.

这是存储过程的干运行:

EXEC    @return_value = [dbo].[GetAttributes]
        @pi_PId = 95102,
        @pi_returnOnly1stRow = 0,
        @pi_returnExtAttr = 1

SELECT  'Return Value' = @return_value
Run Code Online (Sandbox Code Playgroud)

这是来自C#代码的调用:

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand("GetAttributes", conn);
da.SelectCommand.Parameters.AddWithValue("@pi_PId", 95102); 
da.SelectCommand.Parameters.AddWithValue("@pi_returnOnly1stRow", 0);
da.SelectCommand.Parameters.AddWithValue("@pi_returnExtAttr", 1);
da.SelectCommand.CommandType = CommandType.StoredProcedure;

DataSet ds = new DataSet();
da.Fill(ds, "result_name");
DataTable dt = ds.Tables["result_name"];
conn.Close();
Run Code Online (Sandbox Code Playgroud)

编辑:问题返回....

我以为我已经通过杀死导致这个问题的过程解决了这个问题,但遗憾的是它已经返回.我说我对这个问题有了更好的理解,我可以看到问题,但不知道是什么导致这个问题.

问题是一样的.如果直接在SQL服务器上运行但是在从C#程序调用时无法执行,则存储过程运行正常....

我跑了Sp_lock.我使用的存储过程有Spid:'59',其锁定如下所示.我不知道为什么这些表只有在从c#调用存储过程时才被锁定,而不是在SP的干运行期间被锁定.

59  2   0           0   DB  [ENCRYPTION_SCAN]                   S   GRANT
59  5   1802489500  0   PAG 1:169937                            S   GRANT
59  5 …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server-2008-r2

8
推荐指数
1
解决办法
5815
查看次数

防止ColdFusion中数据库死锁的解决方案?

我正在处理的应用程序必须处理许多需要更新数据库上的数据的ajax请求.

[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID 66)在锁定时死锁 与另一个进程通信缓冲资源并被选为死锁牺牲品.重新运行该交易.

对于读取,我已经使用了WITH (NOLOCK)提示,这防止了大量的读取死锁.

我能做些什么来更好地处理写入?

CFLL中的更新代码?

或者有没有办法让SQL Server锁定一行而不是一个表?

有没有人尝试过实施CQRS?似乎解决了这个问题,但我不清楚如何处理:

  1. ID生成(现在它在数据库上使用自动增量)
  2. 如果服务器无法立即将错误发送回客户端,如何处理更新请求失败.

谢谢

sql-server ajax coldfusion cqrs

7
推荐指数
1
解决办法
2389
查看次数

如何避免数据库中的读锁定?

如何避免数据库中的读锁定?

欢迎多个数据库的答案!

sql database performance locking

6
推荐指数
1
解决办法
4241
查看次数

JPA 使用 NO LOCK 读取数据

在我们正在编写的应用程序中,我们需要with(NOLOCK)在查询中使用 。只是为了使查询不会花费很长时间来处理。

我还没有找到任何关于如何实现这一点的信息。我确实发现了如何启用乐观或悲观锁定,但据我所知,这是用于写入数据,而不是读取数据。

有没有办法做到这一点?

我们使用 JPA 和 Criteria API 连接到 MSSQL 服务器,应用程序服务器是 Glassfish 4。

埃特斯

sql sql-server jpa criteria-api jakarta-ee

6
推荐指数
3
解决办法
1万
查看次数

什么是 OLAP 中的锁定问题?

在当地的一家金融机构,我被他们的程序员斥责,因为他们表达了我的观点,(他们的程序员痴迷于)(b)锁定他们的 MS SQL Server 2005 OLAP (SSAS) 数据库中的问题对我来说没有多大意义. (OLTP 数据库是 SQL Server、Oracle 和非 RDBMS ERP)。

如果 OLAP (SSAS) 数据库仅用于读取(部署后只读),那么 OLAP 处理中的锁定问题是什么?

在 SSIS 处理和从 OLTP 数据库传输数据期间,会在哪种情况下出现此类(哪个?)问题?
在将 SSAS (OLAP) 数据库部署到 SSAS 期间?

这个问题不仅限于 SQL Server。

architecture sql-server oracle olap database-design

5
推荐指数
1
解决办法
3167
查看次数

使用 (nolock) 选择

我的老板一直强迫我编写 SELECT 查询以with (nolock)防止死锁。但据我所知,Select 语句默认没有锁,因此选择 withwith (nolock)和选择 without 没有任何区别。如果我错了,请纠正我。

两个查询:

SELECT * from EMP with (nolock)

SELECT * from EMP 
Run Code Online (Sandbox Code Playgroud)

两者不是一样的吗。如果不加nolock会不会容易出现死锁?请告诉我应该使用什么。

sql-server select deadlock sql-server-2008

5
推荐指数
1
解决办法
3万
查看次数

在Dapper SqlBuilder或sp_exectuesql中运行SET语句

我正在尝试使用来在Dapper中设置事务隔离级别SqlBuilder,但似乎没有用。

var builder = new SqlBuilder();
var sqlStatement = builder.AddTemplate(@"
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SELECT * FROM Users
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
conn.Query<User>(sqlStatement.RawSql);
Run Code Online (Sandbox Code Playgroud)

但这有效:

conn.Execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var result = conn.Query<User>(sqlStatement);
conn.Execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
Run Code Online (Sandbox Code Playgroud)

我想这可能是因为使用SqlBuilderDapper构建了动态SQL并使用sp_executesql存储过程执行了。

为了证明我的假设,我尝试了以下SQL语句:

exec sp_executesql N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'
Run Code Online (Sandbox Code Playgroud)

该语句之后,我查询sys.dm_exec_sessions检查我的连接,它仍然显示ReadCommitted数据库中的默认隔离级别。

有什么办法可以SET在单独的地方设置交易级别(或任何其他语句).Execute?或者,也许是一种特殊的使用SET语句的方式sp_executesql

sql sql-server isolation-level dapper

5
推荐指数
1
解决办法
506
查看次数

SQL 2008+ NOLOCK与READPAST报告准确性的注意事项

了解最终决策是业务决策,在SQL 2008 R2中运行的NOLOCK和READPAST之间的准确性考虑是什么?在讨论业务领域的变化之前,我想更好地理解.

我继承了许多查询,用于为管理报告创建数据视图.'WITH(NOLOCK)'被广泛使用但不一致.正在读取的数据来自广泛使用的应用程序的生产服务器,该应用程序不断更新.我们正在从SQL 2005服务器迁移到SQL 2008 R2服务器.这些报告希望数据比存档服务器上的24小时数据更新鲜.使用NOLOCK表明过去的决定; 存在冲突的可能性,并且可以接受一些准确性损失.数据用于填充仪表板以供人类意识/决策制定.

所有查询都是SELECT,具有数据视图登录的只读访问权限.大多数查询是单表,有几个2和3表连接.鉴于连接的低级别()似乎比SET TRANSACTION ISOLATION LEVEL {}更好的选择

表提示(Transact-SQL)http://msdn.microsoft.com/en-us/library/ms187373.aspx(以及关于SO的多个问题)说NOLOCK和/或READUNCOMMITTED可能有重复的读取问题,除了丢失锁定的记录.

READPAST看起来更准确,因为它只会错过锁定的记录,而不会有重复的可能性.但我不确定丢失锁定记录的级别是否与NOLOCK保持一致.

蒂姆·查普曼(Tim Chapman)有一篇很好的文章比较了这两篇文章,但它是在2007年写的,大部分评论都围绕着2000年和2005年,有一条评论指出READPAST在2008 R2中存在问题

参考

NOLOCK提示在SELECT语句中的作用

什么时候应该使用"with(nolock)"

在SQL Server中使用NOLOCK和READPAST表提示(作者Tim Chapman)

编辑:

下面的两个答案中建议了快照隔离.快照隔离是数据库的依赖设置,此Q/A https://serverfault.com/questions/117104/how-can-i-tell-if-snapshot-isolation-is-turned-on描述了如何查看设置在数据库上就位.我现在知道它已被禁用,我正在阅读来自主要应用程序数据库的报告.无法更改设置.+ - 几率的准确度是可以接受的,应用程序(OLTP)的影响是不可接受的.大多数简单查询不需要锁定考虑因素,但在某些极端情况下,需要锁定考虑因素.随着SQL 2005的Snapshot隔离的出现,关于SQL 2008或更高版本中的NOLOCK和READPAST行为的信息很少.但他们仍然是我唯一的选择.

sql sql-server locking

4
推荐指数
1
解决办法
9448
查看次数

从一个表中选择所有列,并从另一个表中选择一个列,其中列等于变量

抱歉标题太长了。

我有一个语句需要从 BinConfig 中获取一行中的所有列:

SELECT * 
FROM BinConfig WITH(NOLOCK) 
WHERE IssuerKey = @IssuerKey
Run Code Online (Sandbox Code Playgroud)

CardRangeGroup但我还需要根据该列从一行中获取一列IssuerKey

我尝试过的:

SELECT 
    BinConfig.*, CardRangeGroup.Name 
FROM 
    BinConfig 
JOIN 
    CardRangeGroup WITH(NOLOCK) 
WHERE 
    @IssuerKey = BinConfig.IssuerKey 
    AND @IssuerKey = CardRangeGroup.IssuerKey
Run Code Online (Sandbox Code Playgroud)

这给了我附近的语法错误WHERE。我尝试在网上查找资源,但我到处都找不到任何解释如何根据传入变量选择行的内容。有什么帮助吗?

sql sql-server

2
推荐指数
1
解决办法
9712
查看次数