NOLOCK 和 ROWLOCK 的使用

合集下载

sqlserver数据库死锁解决方法

sqlserver数据库死锁解决方法

在 SQL Server 数据库中,死锁是两个或多个事务在尝试获取资源时相互阻塞的现象。

死锁会导致事务执行效率降低。

要解决SQL Server 中的死锁问题,可以尝试以下方法:1. 分析死锁:使用 SQL Server Profiler 或 Extended Events 追踪死锁事件,找出导致死锁的事务和资源。

分析完后,针对性地解决死锁问题。

1. 优化锁的粒度:使用较低级别的锁,如行锁(ROWLOCK),代替页面锁或表锁,减少锁定范围,提高并发性。

请注意,这也可能会导致锁争用和事务延迟。

1. 使用 READ COMMITTED SNAPSHOT 或 SNAPSHOT 事务隔离级别:这可以将读取操作与其他事务隔离,以减少锁定冲突。

复制更新时,仍然需要锁定资源,但其他读取事务不会受到阻塞。

1. 保持事务简短并减少锁定时间:缩短事务持续时间,减少锁定资源的时间。

这有助于减少因事务阻塞而导致的死锁风险。

1. 按照相同的顺序访问资源:按照相同的顺序对资源进行加锁可以避免死锁。

这样,在任何给定时刻,事务只需要等待另一个事务释放钥匙,而不是陷入死循环。

1. 使用 TRY...CATCH 语句监视死锁错误:对执行事务的代码进行异常处理,并在TRY...CATCH 语句中处理死锁错误。

这意味着如果死锁发生,事务将被捕获并显示错误信息。

根据需求,可以选择重试事务以处理死锁。

1. 使用 NOLOCK 选项:对于查询只读的情况,可以尝试使用 NOLOCK 选项进行查询。

这允许读取未提交的数据,避免发生死锁。

请注意,这可能会导致脏读问题。

在使用 NOLOCK 之前,务必权衡一下使用该选项所带来的风险。

解决 SQL Server 数据库死锁问题需要针对具体情况进行分析和调整。

对数据库表和事务进行优化,根据实际应用场景选择适当的锁策略,有助于降低死锁的发生概率。

在确保数据完整性的前提下,采取上述方法之一或多个来解决死锁问题。

sqlserver锁表语句

sqlserver锁表语句

sqlserver锁表语句SQL Server中可以使用锁表语句来对数据库中的表进行加锁,以保证数据的一致性和并发性。

下面列举了10个常用的SQL Server锁表语句:1. SELECT * FROM table_name WITH (NOLOCK)这是最常用的锁表语句之一,它会对表进行读取加锁,但不阻塞其他事务对该表的读取操作。

2. SELECT * FROM table_name WITH (UPDLOCK)这个语句会对表进行读取加锁,并且阻塞其他事务对该表的写入和删除操作。

3. SELECT * FROM table_name WITH (XLOCK)这个语句会对表进行写入加锁,并且阻塞其他事务对该表的读取、写入和删除操作。

4. SELECT * FROM table_name WITH (ROWLOCK)这个语句会对表的行进行加锁,而不是对整个表进行加锁,可以提高并发性能。

5. SELECT * FROM table_name WITH (TABLOCK)这个语句会对整个表进行加锁,阻塞其他事务对该表的任何操作。

6. SELECT * FROM table_name WITH (TABLOCKX)这个语句会对整个表进行排他性加锁,阻塞其他事务对该表的任何操作。

7. BEGIN TRANSACTION这个语句用于开始一个事务,在事务内的操作会自动加锁。

8. COMMIT TRANSACTION这个语句用于提交一个事务,释放事务中的锁。

9. ROLLBACK TRANSACTION这个语句用于回滚一个事务,取消事务中的操作,并释放锁。

10. SET TRANSACTION ISOLATION LEVEL这个语句用于设置事务的隔离级别,以控制事务对数据库的锁定行为。

需要注意的是,在使用锁表语句时,应根据实际业务需求和数据库性能进行选择和调整。

过多的加锁可能会导致死锁和性能问题,而过少的加锁可能会导致数据不一致。

sqlserver nolock用法

sqlserver nolock用法

sqlserver nolock用法SQL Server是一款常用的关系型数据库管理系统,它提供了多种用于查询和操作数据的语言和工具。

在SQL Server中,可以使用多种方法来提高数据库的性能和可用性。

其中,使用nolock关键字是一种常见的方法,它可以帮助程序员解决并发访问数据库时的资源竞争问题。

本文将详细介绍nolock关键字的用法,以及使用nolock关键字时需要注意的事项。

一、nolock关键字的概念和作用在理解nolock关键字的用法之前,首先需要了解数据库事务和锁的概念。

数据库事务是指一系列操作语句的集合,这些语句要么全部执行成功,要么全部回滚。

在并发访问数据库的环境中,不同的事务可能同时读取和修改数据库中的数据,这就可能导致资源竞争问题。

为了解决这个问题,数据库管理系统引入了锁机制,它可以控制并发事务对共享资源的访问。

nolock关键字是一种用于查询语句的提示选项,它告诉数据库管理系统在读取数据时不要进行锁定操作。

使用nolock关键字可以避免因为资源竞争导致的性能下降和死锁问题。

然而,使用nolock关键字也可能导致数据不一致的问题,因此需要在使用时谨慎考虑。

二、nolock关键字的用法在SQL Server中,可以使用nolock关键字来指定查询语句中的表或视图不进行锁定操作。

以下是nolock关键字的具体用法:1. 在查询语句中使用nolock关键字在查询语句中,可以使用nolock关键字来提示数据库管理系统不要对查询的表进行锁定操作。

例如,下面的查询语句使用了nolock关键字:SELECT * FROM table_name WITH (NOLOCK)2. 在表名或视图名前使用nolock关键字除了在查询语句中使用nolock关键字外,还可以在表名或视图名前使用nolock关键字来指定查询中的表或视图不进行锁定操作。

例如,下面的查询语句使用了nolock关键字:SELECT * FROM [table_name] (NOLOCK)3. 使用nolock关键字的注意事项使用nolock关键字可以避免锁定操作导致的性能下降和死锁问题,但同时也可能导致数据不一致的问题。

sql语句对数据库表进行加锁和解锁

sql语句对数据库表进行加锁和解锁

sql语句对数据库表进⾏加锁和解锁锁是数据库中的⼀个⾮常重要的概念,它主要⽤于多⽤户环境下保证数据库完整性和⼀致性。

我们知道,多个⽤户能够同时操纵同⼀个数据库中的数据,会发⽣数据不⼀致现象。

即如果没有锁定且多个⽤户同时访问⼀个数据库,则当他们的事务同时使⽤相同的数据时可能会发⽣问题。

这些问题包括:丢失更新、脏读、不可重复读和幻觉读:1.丢失更新:当两个或多个事务选择同⼀⾏,然后基于最初选定的值更新该⾏时,会发⽣丢失更新问题。

每个事务都不知道其它事务的存在。

最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

例如,两个编辑⼈员制作了同⼀⽂档的电⼦复本。

每个编辑⼈员独⽴地更改其复本,然后保存更改后的复本,这样就覆盖了原始⽂档。

最后保存其更改复本的编辑⼈员覆盖了第⼀个编辑⼈员所做的更改。

如果在第⼀个编辑⼈员完成之后第⼆个编辑⼈员才能进⾏更改,则可以避免该问题。

2.脏读脏读就是指当⼀个事务正在访问数据,并且对数据进⾏了修改,⽽这种修改还没有提交到数据库中,这时,另外⼀个事务也访问这个数据,然后使⽤了这个数据。

因为这个数据是还没有提交的数据,那么另外⼀个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

例如,⼀个编辑⼈员正在更改电⼦⽂档。

在更改过程中,另⼀个编辑⼈员复制了该⽂档(该复本包含到⽬前为⽌所做的全部更改)并将其分发给预期的⽤户。

此后,第⼀个编辑⼈员认为⽬前所做的更改是错误的,于是删除了所做的编辑并保存了⽂档。

分发给⽤户的⽂档包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。

如果在第⼀个编辑⼈员确定最终更改前任何⼈都不能读取更改的⽂档,则可以避免该问题。

3.不可重复读不可重复读是指在⼀个事务内,多次读同⼀数据。

在这个事务还没有结束时,另外⼀个事务也访问该同⼀数据。

那么,在第⼀个事务中的两次读数据之间,由于第⼆个事务的修改,那么第⼀个事务两次读到的的数据可能是不⼀样的。

这样就发⽣了在⼀个事务内两次读到的数据是不⼀样的,因此称为是不可重复读。

mysql 的withnolock用法

mysql 的withnolock用法

mysql 的withnolock用法
在MySQL 中,WITH (NOLOCK)不是一个直接的语法。

WITH (NOLOCK)通常是Microsoft SQL Server 中用于指定在查询时不加锁的一种语法。

在MySQL 中,可以使用一些不同的机制来达到类似的效果,例如使用事务隔离级别或使用FOR UPDATE和LOCK IN SHARE MODE等语法。

以下是在MySQL 中模拟WITH (NOLOCK)的一些方法:
1.使用事务隔离级别:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 在这里执行你的查询
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 恢复默认隔离级别
注意:将事务隔离级别设置为READ UNCOMMITTED可以达到类似WITH (NOLOCK)的效果,但这也可能导致读取到未提交的事务数据,增加脏读的风险。

2.使用FOR UPDATE 和LOCK IN SHARE MODE:
-- 不加锁读取
SELECT * FROM your_table;
-- 加锁读取
SELECT * FROM your_table FOR UPDATE;
使用FOR UPDATE或LOCK IN SHARE MODE可以实现对行或表的
加锁或不加锁读取。

请注意,在使用这些方法时需要谨慎,因为不加锁读取可能导致脏读或不可重复读等问题。

选择适当的方法取决于你的具体业务需求和数据一致性要求。

oracle nolock 写法

oracle nolock 写法

在 Oracle 数据库中,与某些其他数据库管理系统不同,没有类似于 SQL Server 中NOLOCK提示的直接等价物。

在 Oracle 中,事务的隔离级别由READ COMMITTED控制,而且默认情况下,Oracle 会使用这个隔离级别。

Oracle 数据库使用多版本并发控制(MVCC)来实现事务的隔离。

尽管 Oracle 没有直接的NOLOCK提示,但你可以通过使用以下方法来达到类似的效果:1. READ UNCOMMITTED 隔离级别:虽然 Oracle 没有直接的NOLOCK提示,但你可以使用READ UNCOMMITTED隔离级别,这类似于 SQL Server 中的NOLOCK提示。

在 Oracle 中,默认的隔离级别是READ COMMITTED,但你可以通过以下方式在会话级别设置为READ UNCOMMITTED:请注意,这会话级别设置可能会对性能和一致性产生一些影响,因此在使用之前请仔细考虑。

2. 使用 READ COMMITTED 隔离级别并增加并发度:Oracle 默认使用READ COMMITTED隔离级别,这通常足够满足大多数应用的需求。

如果你想提高并发度,你可以尝试通过优化查询和调整索引等方式来实现。

确保你的查询是有效的,并且索引被正确使用。

3. 合理设计事务:设计事务时,考虑到并发性和锁的使用是很重要的。

合理设计事务可以最大程度地减少锁的争夺,提高并发性。

请注意,Oracle 不像某些其他数据库系统那样提供NOLOCK提示,因为 Oracle 的MVCC 和隔离级别机制提供了一种更灵活和一致的方式来处理并发事务。

在使用数据库时,应根据具体的业务需求和性能要求来选择合适的隔离级别和优化策略。

SQL技巧总结patIndex查询wheredecimal用法

SQL技巧总结patIndex查询wheredecimal⽤法⼀些常⽤SQL的总结patIndex ,where ,decimal 等函数的巧⽤--1.charIndex 精确查找字符串的位置declare@charIndex varchar(500)set@charIndex='MicrosoftSQLServerManagement'--返回字符串中'soft'的位置select charIndex('soft',@charIndex)--2.patIndex 可以模糊查找字符串的位置(可以使⽤通配符)declare@patIndex varchar(500)set@patIndex='2000個'--patindex('%[^0-9]%',@patIndex)取字符串中第⼀个不是数字的位置--取字符的数字部分select substring(@patIndex,1,patindex('%[^0-9]%',@patIndex)-1)--3. ISNULL 多条件查询where 巧⽤--例如--传⼊参数declare@PCProductID intdeclare@CategoryID intselect*fromDemo PWHERE--当 @PCProductID 为NUll表明该查询条件未输⼊,不执⾏该条件查询--⽤以下⽅法可以直接使⽤P.商品CD =isnull(@PCProductID,P.商品CD)AND-- @CategoryID=''表⽰全选所有类别,查询所有的类型--以下⽤法兼顾了有个别类别和全选的情况(P.类别=@CategoryID or@CategoryID='')--4.decimal与round--round和decimal都可以固定位数四舍五⼊,round不能处理⽆限⼩数,decimal可以处理⽆限⼩数--在处理⾦额,等精确数字是⼀定要⽤decimal保存⼩数位数要尽量的多,不要⽤money类型,money类型⼀旦进过⼆次计算会很不精确--5. nolock 和 rowlocknolock即不加锁,可以快速读取表的数据,缺点可能会读取到脏数据(事务未回滚完的数据等),⼀般只⽤操作频率很⾼的表查询数据例如: select * from DataOnToday with (nolock)rowlock 即⾏级别加锁如果该表数据量很⼤会加重负荷。

mysql 的withnolock用法

mysql 的withnolock用法全文共四篇示例,供读者参考第一篇示例:MySQL 是一个开源的关系型数据库管理系统,较为流行并被广泛使用于各大公司和组织中。

在进行数据库操作时,我们常常会碰到锁的问题。

数据库的锁定是为了确保数据一致性和并发性。

而在MySQL 中,可通过使用`WITH NOLOCK` 来解决一些读取数据时的锁定问题。

`WITH NOLOCK` 是MySQL 中的一个查询提示,它的作用是在查询时不进行加锁操作,即不会对查询的数据行进行锁定。

这样可以避免由于数据锁定导致的阻塞和性能问题,提升查询的效率。

但是需要注意的是使用`WITH NOLOCK` 也可能引发一些潜在的风险,例如读取到脏数据。

在实际应用中,我们可以在查询语句的`FROM` 子句后面添加`WITH NOLOCK` 来使用这个查询提示。

示例如下:```sqlSELECT * FROM table_name WITH NOLOCK;```下面我们就来详细讲解一下`WITH NOLOCK` 的使用方法和注意事项。

### 1. 使用方法这样就可以在查询`table_name` 表的数据时不进行加锁操作,提高查询效率。

### 2. 注意事项使用`WITH NOLOCK` 虽然能够提高查询效率,但也存在一些潜在的风险和问题需要注意:由于数据未加锁,可能会导致读取到未提交的事务数据,即脏数据。

这可能会引起数据不一致的问题。

在某些情况下,即使不进行数据加锁,也可能会出现幻读问题。

比如在某个事务中插入了新数据,但在查询时出现了其他未提交事务的数据。

#### 2.3 数据一致性由于数据不进行加锁,可能会导致查询结果不一致,这可能会对业务产生影响。

- 对数据准确性要求不高,即可以容忍一定程度的数据不一致时。

- 需要进行大量读操作,而对数据一致性要求不高时。

- 在数据庞大的表中进行查询时,提高查询效率。

在一些要求数据一致性的情况下,可以考虑使用其他的加锁方式来代替`WITH NOLOCK`,比如使用`FOR UPDATE`、`LOCK IN SHARE MODE` 等。

sql server nolock用法

SQL Server中的NOLOCK用法1. 介绍SQL Server是一种常用的关系型数据库管理系统,用于存储和管理大量的数据。

在SQL Server中,使用NOLOCK是一种常见的技巧,用于在读取数据时不锁定表或行,从而提高查询性能。

本文将探讨SQL Server中NOLOCK的具体用法,并对其进行深入分析和讨论。

2. 什么是NOLOCK?NOLOCK是SQL Server中的一种查询提示,也被称为“脏读”。

它的作用是告诉数据库引擎在执行查询时不必等待其他会话释放对所请求数据的锁。

这意味着在使用NOLOCK时,可以读取正在被其他会话修改或删除的数据,从而提高了查询性能的同时也增加了数据不一致的风险。

3. NOLOCK的使用方法在SQL Server中,可以通过在查询语句中使用WITH(NOLOCK)或加上表级别的HINT来使用NOLOCK。

例如:```sqlSELECT * FROM table_name WITH(NOLOCK)```或```sqlSELECT * FROM table_name (NOLOCK)```4. NOLOCK的优势和劣势使用NOLOCK的优势在于提高了查询性能,尤其是在对大型表进行读取时。

然而,NOLOCK也存在着一些劣势。

由于读取的数据可能是未提交的或者正在被修改的,因此会增加数据不一致的风险。

当数据正在被修改或删除时,使用NOLOCK可能会导致查询结果出现丢失或重复的情况。

5. 个人观点和建议从个人观点来看,使用NOLOCK需要慎重考虑。

在一些特定的场景下,如对静态表的读取或具有较低一致性要求的报表查询,可以考虑使用NOLOCK来提高查询性能。

然而,对于事务性的操作或对数据一致性要求较高的场景,建议不要轻易使用NOLOCK,而应该采用其他方式来提升性能,如调整索引、优化查询语句等。

总结NOLOCK是SQL Server中常用的查询提示,可以用于在查询时不锁定表或行,从而提高查询性能。

MSSqlserver的锁模式介绍

MSSqlserver的锁模式介绍⼀ SQL Server 锁类型的说明在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使⽤不同程度的加锁⽅式,即有多种模式,SQL Server中锁模式包括:1.共享锁(S) 共享锁⽤于所以的制度数据操作。

共享锁是⾮独占的,允许多个并发事务读取其锁定的资源。

默认情况下,数据被读取后,SQL Server⽴刻释放共享锁。

例如: 执⾏查询"SELECT * FROM dbo.Customer"时,⾸先锁定第⼀页,读取之后,释放对第⼀页的锁定,然后锁定第⼆页。

这样,就允许在读操作过程中,修改未被锁定的第⼀页。

但是,事务隔离级别链接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。

执⾏查询"SELECT * FROM dbo.Customer WITH(HOLDLOCK)"就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。

2.更新锁(U) 更新锁在修改操作的初始化阶段⽤来锁定可能要被修改的资源,这样可以避免使⽤共享锁(S)造成的死锁现象。

因为使⽤共享锁(S)时,修改数据的操作分为两步,⾸先获得⼀个共享锁(S),读取数据,然后再将共享锁升级为排它锁(X),然后执⾏修改操作。

这样如果同时⼜两个或多个事务同时对⼀个事务申请共享锁,在修改数据的时候,这些事务将共享锁升级为排它锁(X)。

这时,这些事务都不会释放共享锁⽽是⼀直等待对⽅释放,这样就造成了死锁。

如果⼀个数据在修改前直接申请更新锁(U),在数据修改的时候再升级为排它锁(X),就可以避免死锁。

3.结构锁(Sch)执⾏表的数据定义语⾔(DDL)操作(例如添加列或除去表)时使⽤架构修改(Sch-M)锁。

当编译查询时,使⽤架构稳定性(Sch-S)锁。

架构稳定性锁不阻塞任何事务锁,包括排它锁。

因此在编译查询时,其它事务(包括在表上有排它锁的事务)都能继续运⾏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOLOCK 和 ROWLOCK 的使用2008-11-18 12:42最近一年老是受到MSSQLSERVER数据库阻塞的困扰,单表记录已突破400万条,除了分库似乎没有别的方法,使用分区存储,数据库又要重新设计,考虑到程序中使用较多的就是查询,而查询会受到更新与删除的影响,更新与删除引发的页面锁不光锁定正在修改的记录,还会有很多其它记录也会被锁定,会导致查询的阻塞,要加快一些查询的速度,我们可以使用nolock和rowlock,今天对一些查询作了一些修改,运行一段时间看看结果,下面对于SQLSERVER的锁争用及nolock,rowlock的原理及使用作一个简单描述:锁争用的描述那些不仅仅使用行级锁的数据库使用一种称为混和锁(lock escalation)的技术来获取较高的性能。

除非很明确知道是针对整个数据表,否则这些数据库的做法是开始使用行级锁,然后随着修改的数据增多,开始使用大范围的锁机制。

不幸的是,这种混和锁的方法会产生和放大新的问题:死锁。

如果两个用户以相反的顺序修改位于不同表的记录,而这两条记录虽然逻辑上不相关,但是物理上是相邻的,操作就会先引发行锁,然后升级为页面锁。

这样,两个用户都需要对方锁定的东西,就造成了死锁。

例如:用户A修改表A的一些记录,引发的页面锁不光锁定正在修改的记录,还会有很多其它记录也会被锁定。

用户B修改表B的一些记录,引发的页面锁锁定用户A和其它正在修改的数据。

用户A想修改用户B在表B中锁定(并不一定正在修改的)数据。

用户B想修改或者仅仅想访问用户A在表A中锁定(并不一定正在修改)的数据。

为了解决该问题,数据库会经常去检测是否有死锁存在,如果有,就把其中的一个事务撤销,好让另一个事务能顺利完成。

一般来说,都是撤销那个修改数据量少的事务,这样回滚的开销就比较少。

使用行级锁的数据库很少会有这个问题,因为两个用户同时修改同一条记录的可能性极小,而且由于极其偶然的修改数据的顺序而造成的锁也少。

而且,数据库使用锁超时来避免让用户等待时间过长。

查询超时的引入也是为了同样目的。

我们可以重新递交那些超时的查询,但是这只会造成数据库的堵塞。

如果经常发生超时,说明用户使用SQL Server的方式有问题。

正常情况是很少会发生超时的。

在服务器负载较高的运行环境下,使用混合锁的SQL Server锁机制,表现不会很好。

原因是锁争用(Lock Contention)。

锁争用造成死锁和锁等待问题。

在一个多用户系统中,很多用户会同时在修改数据库,还有更多的用户在同时访问数据库,随时会产生锁,用户也争先恐后地获取锁以确保自己的操作的正确性,死锁频繁发生,这种情形下,用户的心情可想而知。

确实,如果只有少量用户,SQL Server不会遇到多少麻烦。

内部测试和发布的时候,由于用户较少,也很难发现那些并发问题。

但是当激发几百个并发,进行持续不断地INSERT,UPDATE,以及一些 DELETE操作时,如何观察是否有麻烦出现,那时候你就会手忙脚乱地去解锁。

锁争用的解决方法SQL Server开始是用行级锁的,但是经常会扩大为页面锁和表锁,最终造成死锁。

即使用户没有修改数据,SQL Server在SELECT的时候也会遇到锁。

幸运的是,我们可以通过SQL Server 的两个关键字来手工处理:NOLOCK和ROWLOCK。

它们的使用方法如下:SELECT COUNT(UserID)FROM Users WITH (NOLOCK)WHERE Username LIKE 'foobar'和UPDATE Users WITH (ROWLOCK)SET Username = 'fred' WHERE Username = 'foobar'NOLOCK的使用NOLOCK可以忽略锁,直接从数据库读取数据。

这意味着可以避开锁,从而提高性能和扩展性。

但同时也意味着代码出错的可能性存在。

你可能会读取到运行事务正在处理的无须验证的未递交数据。

这种风险可以量化。

如果是金融方面的代码或者一些非常规的总计(你想绝对保证安全性),你应该小心行事并且不使用这种技术。

但是我认为使用该技术会比你90%应用系统性能要好,当用户(或者是交互代码)发现一个未递交的修改时,使用技术会保证不会像未使用该技术那样引起大麻烦。

实际上,你可能发现你的大多数数据很少或者甚至不进行修改的,这样我们就不会因为这些数据被锁住而浪费大量的时间。

例如,如果你想统计在2000年6月份到8月份之间加入的所有用户,就没有理由去锁住任何记录: 2000年9月1号一到来,这个用户数就是确定的。

又例如要列举在的文件列表:这种结果即使不是100%的正确,也不是大问题。

因为你要么不拥有该文件,当然也无所谓你是否能找到它,或者你确实拥有该文件,这种情况下你当然知道你是否修改了该文件,以及该文件是否已经上传完毕了。

但是,如果这些数据的修改,对数据库来说是基础性的修改,或者这些数据对于用户来说,必须是百分之百保证是修改正确的(例如帐单或者余额数据),那么你不要使用该技术。

ROWLOCK的使用ROWLOCK告诉SQL Server只使用行级锁。

ROWLOCK语法可以使用在SELECT,UPDATE和DELETE语句中,不过我习惯仅仅在UPDATE和DELETE语句中使用。

如果在UPDATE语句中有指定的主键,那么就总是会引发行级锁的。

但是当SQL Server对几个这种UPDATE进行批处理时,某些数据正好在同一个页面(page),这种情况在当前情况下是很有可能发生的,这就象在一个目录中,创建文件需要较长的时间,而同时你又在更新这些文件。

当页面锁引发后,事情就开始变得糟糕了。

而如果在UPDATE 或者DELETE时,没有指定主键,数据库当然认为很多数据会收到影响,那样就会直接引发页面锁,事情同样变得糟糕。

通过指定使用行级锁,这种情况可以得到避免。

但是需要小心的是,如果你错误地使用在过多行上,数据库并不会聪明到自动将行级锁升级到页面锁,服务器也会因为行级锁的开销而消耗大量的内存和CPU,直至无法响应。

尤其主要留意的是企业管理器中"管理/当前活动"(Management/Current Activity)这一项。

该项会花较长的时间来载入锁的信息。

这些信息时十分有用的,当你使用行级锁后,你如果在"锁/处理"(Locks/Processes)下看到几百个锁,一点都不奇怪,而恰恰应该庆幸锁超时和死锁的问题减少了。

注意事项我认为SQL Server倾向于使用NOLOCK关键字,而ROWLOCK关键字由用户根据情况自行决定。

你可以仅仅在 SELECT语句中使用NOLOCK,这些SELECT语句场合包括INNER查询,以及在INSERT语句中的SELECT使用,在连接查询下也可以使用,例如:SELECT COUNT(erID)FROM Users WITH (NOLOCK)JOIN UsersInUserGroups WITH (NOLOCK) ONerID = erIDNOLOCK 和 ROWLOCK的使用效果很难去量化在使用NOLOCK和ROWLOCK后,或者你的网站性能到底改善了多少。

不过在使用NOLOCK和ROWLOCK前,的速度很慢,而且经常无法使用,以及很不稳定。

使用后,就变得快速、容易访问以及稳定了。

两者简直就是天壤之别。

这些改变当然无法在关于锁的文档中很难找到。

那些文档会建议你重写你的应用,当表数据被使用,锁产生了(没错,就是这样),然后你应该使用小事务并且以批处理的形式执行(不错,实际经验就是如此),使用低级别的隔离措施 (也没错,NOLOCK就是一个极端的例子),还建议你有限的连接,从而让处理器进行合作(好复杂的描述,而且总觉得怪怪的不像个好点子)。

我不知道是否用数据库咨询师会提到本文中的技术(或类似的技术),但是我只想说的是,的运行状况的确因为该技术得到了改善。

如果你遇到了锁争用的问题,也可以试试NOLOCK和ROWLOCK。

申明是否使用NOLOCK和ROWLOCK,需要自行判断,并谨慎运用。

我用该技术的方法是通过查看我的存储过程和即时查询语句,在我自己的理解上来觉得哪里用和如何用。

我需要判断如果用NOLOCK 而引起一些返回的不准确,或者ROWLOCK是否会造成太多的锁,这些情况出现时,对于访问者或者使用者来说,是否是可以接受的。

在大多数情况下,我认为是没有问题的,但是也许你的代码不适用,你需要小心对待。

你需要创建一些独立的过程,是否加锁,如何加锁,以作为对比。

当UPDATE或者 DELETE查询影响到很多数据行时,你在使用PAGELOCK,TABLOCK时也会遇到别的问题。

附:---------------UPDLOCK读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。

UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。

这是SqlServer2000中对更新锁的说明.当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加上锁的记录在其它的线程中是不能更改的只能等本线程的事务结束后才能更改,我如下示例:BEGIN TRANSACTION --开始一个事务SELECT QtyFROM myTable WITH (UPDLOCK)WHERE Id in (1,2,3)UPDATE myTable SET Qty = Qty - A.QtyFROM myTable AS AINNER JOIN @_Table AS B ON A.ID = B.IDCOMMIT TRANSACTION --提交事务这样在更新时其它的线程或事务在这些语句执行完成前是不能更改ID是1,2,3的记录的.其它的都可以修改和读,1,2,3的只能读,要是修改的话只能等这些语句完成后才能操作.从而保证的数据的修改正确。

相关文档
最新文档