我想知道SELECT WITH (NOLOCK)如果影响该表的唯一其他查询是SELECT查询,在表上使用的好处是什么.
这是如何由SQL Server处理的?将一个SELECT查询块另一个SELECT查询?
我正在使用SQL Server 2012和Linq-to-SQL DataContext.
(编辑)
关于表现:
SELECT必须等待第一个SELECT完成SELECT吗?SELECT WITH (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 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) 我有一个存储过程,它有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) 我正在处理的应用程序必须处理许多需要更新数据库上的数据的ajax请求.
[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID 66)在锁定时死锁 与另一个进程通信缓冲资源并被选为死锁牺牲品.重新运行该交易.
对于读取,我已经使用了WITH (NOLOCK)提示,这防止了大量的读取死锁.
我能做些什么来更好地处理写入?
CFLL中的更新代码?
或者有没有办法让SQL Server锁定一行而不是一个表?
有没有人尝试过实施CQRS?似乎解决了这个问题,但我不清楚如何处理:
谢谢
在我们正在编写的应用程序中,我们需要with(NOLOCK)在查询中使用 。只是为了使查询不会花费很长时间来处理。
我还没有找到任何关于如何实现这一点的信息。我确实发现了如何启用乐观或悲观锁定,但据我所知,这是用于写入数据,而不是读取数据。
有没有办法做到这一点?
我们使用 JPA 和 Criteria API 连接到 MSSQL 服务器,应用程序服务器是 Glassfish 4。
埃特斯
在当地的一家金融机构,我被他们的程序员斥责,因为他们表达了我的观点,(他们的程序员痴迷于)(b)锁定他们的 MS SQL Server 2005 OLAP (SSAS) 数据库中的问题对我来说没有多大意义. (OLTP 数据库是 SQL Server、Oracle 和非 RDBMS ERP)。
如果 OLAP (SSAS) 数据库仅用于读取(部署后只读),那么 OLAP 处理中的锁定问题是什么?
在 SSIS 处理和从 OLTP 数据库传输数据期间,会在哪种情况下出现此类(哪个?)问题?
在将 SSAS (OLAP) 数据库部署到 SSAS 期间?
这个问题不仅限于 SQL Server。
我的老板一直强迫我编写 SELECT 查询以with (nolock)防止死锁。但据我所知,Select 语句默认没有锁,因此选择 withwith (nolock)和选择 without 没有任何区别。如果我错了,请纠正我。
两个查询:
SELECT * from EMP with (nolock)
SELECT * from EMP
Run Code Online (Sandbox Code Playgroud)
两者不是一样的吗。如果不加nolock会不会容易出现死锁?请告诉我应该使用什么。
我正在尝试使用来在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 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中存在问题
参考
在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行为的信息很少.但他们仍然是我唯一的选择.
抱歉标题太长了。
我有一个语句需要从 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-server ×10
sql ×8
locking ×2
select ×2
t-sql ×2
ajax ×1
architecture ×1
c# ×1
coldfusion ×1
cqrs ×1
criteria-api ×1
dapper ×1
database ×1
deadlock ×1
jakarta-ee ×1
jpa ×1
linq-to-sql ×1
nolock ×1
olap ×1
oracle ×1
performance ×1