- 浏览: 98994 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (133)
- jQuery (11)
- XML (3)
- 组件 (1)
- JAVA (20)
- WEB (3)
- SPRING (6)
- HIBERNATE (5)
- AJAX (2)
- JS (1)
- JAVA webservice (1)
- Ditu (1)
- WEBSITE (1)
- HIBERNATE ANNOTATION (1)
- 排序 (1)
- TCP_NODELAY (1)
- ConvertUtils (1)
- Logistics (1)
- SQL SERVER 中identity (4)
- sql server (35)
- MYSQL (1)
- Eclipse (6)
- ORACLE (6)
- FLEX (4)
- notepad++ (0)
- UNION ALL (1)
- JUnit (3)
- SQL 异常处理 (1)
- @@trancount (1)
- IOS (1)
- ORA-02266 (1)
- REMOTE DESKTOP (0)
- HTML 优化 (1)
- CRLF (1)
- SQL Server Sequence (1)
最新评论
-
zjuttsw:
看的舒服
重要的hashcode equals转载
http://hi.baidu.com/gabriel/item/11f32132593557c31a96961a
大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。
什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如:
1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。
2:不可重复读,一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成两次读取的记录不同,如果事务中锁定这条记录就可以避免。
3:幻读,指用户读取一批记录的情况,用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据做了修改,方法可能是修改,删除,新增,第二次查询时,会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中。
为什么会在查询的表后面加nolock标识?为了避免并发访问产生的不利影响,SQL Server有两种并发访问的控制机制:锁、行版本控制,表后面加nolock是解决并发访问的方案之一。
1> 锁,每个事务对所依赖的资源会请求不同类型的锁,它可以阻止其他事务以某种可能会导致事务请求锁出错的方式修改资源。当事务不再依赖锁定的资源时,锁将被释放。
锁的类型:1:表类型:锁定整个表;2:行类型:锁定某个行;3:文件类型:锁定某个数据库文件;4:数据库类型:锁定整个数据库;5:页类型:锁定8K为单位的数据库页。
锁的分类还有一种分法,就是按用户和数据库对象来分:
1). 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
1:共享 (S) :用于不更改或不更新数据的操作(只读操作),一般常见的例如select语句。
2:更新 (U) :用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
3:排它 (X) :用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
2). 从程序员的角度看:分为乐观锁和悲观锁。
1:乐观锁:完全依靠数据库来管理锁的工作。
2:悲观锁:程序员自己管理数据或对象上的锁处理。
一般程序员一看到什么锁之类,觉的特别复杂,对专业的DBA当然是入门级知识了。可喜的是程序员不用去设置,控制这些锁,SQLServer通过设置事务的隔离级别自动管理锁的设置和控制。锁管理器通过查询分析器分析待执行的sql语句,来判断语句将会访问哪些资源,进行什么操作,然后结合设定的隔离级别自动分配管理需要用到的锁。
2>:行版本控制:当启用了基于行版本控制的隔离级别时,数据库引擎 将维护修改的每一行的版本。应用程序可以指定事务使用行版本查看事务或查询开始时存在的数据,而不是使用锁保护所有读取。通过使用行版本控制,读取操作阻止其他事务的可能性将大大降低。也就是相当于针对所有的表在查询时都会加上nolock,同样会产生脏读的现象,但差别在于在一个统一管理的地方。说到了基于行版本控制的隔离级别,这里有必要说下隔离级别的概念。
隔离级别的用处:控制锁的应用,即什么场景应用什么样的锁机制。
最终目的:解决并发处理带来的种种问题。
隔离级别的分类:
1:未提交读,隔离事务的最低级别,只能保证不读取物理上损坏的数据;
2:已提交读,数据库引擎的默认级;
3:可重复读;
4:可序列化;隔离事务的最高级别,事务之间完全隔离。
小结:NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 。nolock确实在查询时能提高速度,但它并不是没有缺点的,起码它会引起脏读。
nolock的使用场景(个人观点):
1:数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的;
2:允许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。
3:数据不经常修改的表,这样会省于锁定表的时间来大大加快查询速度。
综上所述,如果在项目中的每个查询的表后面都加nolock,这种做法并不科学,起码特别费时间,不如行版本控制来的直接有效。而且会存在不可预期的技术问题。应该有选择性的挑选最适合的表来放弃共享锁的使用。
最后说下nolock和with(nolock)的几个小区别:
1:SQL05中的同义词,只支持with(nolock);
2:with(nolock)的写法非常容易再指定索引。
跨服务器查询语句时 不能用with (nolock) 只能用nolock
同一个服务器查询时 则with (nolock)和nolock都可以用
比如
SQL code
select * from [IP].a.dbo.table1 with (nolock) 这样会提示用错误select * from a.dbo.table1 with (nolock) 这样就可以
大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。
什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如:
1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。
2:不可重复读,一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成两次读取的记录不同,如果事务中锁定这条记录就可以避免。
3:幻读,指用户读取一批记录的情况,用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据做了修改,方法可能是修改,删除,新增,第二次查询时,会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中。
为什么会在查询的表后面加nolock标识?为了避免并发访问产生的不利影响,SQL Server有两种并发访问的控制机制:锁、行版本控制,表后面加nolock是解决并发访问的方案之一。
1> 锁,每个事务对所依赖的资源会请求不同类型的锁,它可以阻止其他事务以某种可能会导致事务请求锁出错的方式修改资源。当事务不再依赖锁定的资源时,锁将被释放。
锁的类型:1:表类型:锁定整个表;2:行类型:锁定某个行;3:文件类型:锁定某个数据库文件;4:数据库类型:锁定整个数据库;5:页类型:锁定8K为单位的数据库页。
锁的分类还有一种分法,就是按用户和数据库对象来分:
1). 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
1:共享 (S) :用于不更改或不更新数据的操作(只读操作),一般常见的例如select语句。
2:更新 (U) :用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
3:排它 (X) :用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
2). 从程序员的角度看:分为乐观锁和悲观锁。
1:乐观锁:完全依靠数据库来管理锁的工作。
2:悲观锁:程序员自己管理数据或对象上的锁处理。
一般程序员一看到什么锁之类,觉的特别复杂,对专业的DBA当然是入门级知识了。可喜的是程序员不用去设置,控制这些锁,SQLServer通过设置事务的隔离级别自动管理锁的设置和控制。锁管理器通过查询分析器分析待执行的sql语句,来判断语句将会访问哪些资源,进行什么操作,然后结合设定的隔离级别自动分配管理需要用到的锁。
2>:行版本控制:当启用了基于行版本控制的隔离级别时,数据库引擎 将维护修改的每一行的版本。应用程序可以指定事务使用行版本查看事务或查询开始时存在的数据,而不是使用锁保护所有读取。通过使用行版本控制,读取操作阻止其他事务的可能性将大大降低。也就是相当于针对所有的表在查询时都会加上nolock,同样会产生脏读的现象,但差别在于在一个统一管理的地方。说到了基于行版本控制的隔离级别,这里有必要说下隔离级别的概念。
隔离级别的用处:控制锁的应用,即什么场景应用什么样的锁机制。
最终目的:解决并发处理带来的种种问题。
隔离级别的分类:
1:未提交读,隔离事务的最低级别,只能保证不读取物理上损坏的数据;
2:已提交读,数据库引擎的默认级;
3:可重复读;
4:可序列化;隔离事务的最高级别,事务之间完全隔离。
小结:NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 。nolock确实在查询时能提高速度,但它并不是没有缺点的,起码它会引起脏读。
nolock的使用场景(个人观点):
1:数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的;
2:允许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。
3:数据不经常修改的表,这样会省于锁定表的时间来大大加快查询速度。
综上所述,如果在项目中的每个查询的表后面都加nolock,这种做法并不科学,起码特别费时间,不如行版本控制来的直接有效。而且会存在不可预期的技术问题。应该有选择性的挑选最适合的表来放弃共享锁的使用。
最后说下nolock和with(nolock)的几个小区别:
1:SQL05中的同义词,只支持with(nolock);
2:with(nolock)的写法非常容易再指定索引。
跨服务器查询语句时 不能用with (nolock) 只能用nolock
同一个服务器查询时 则with (nolock)和nolock都可以用
比如
SQL code
select * from [IP].a.dbo.table1 with (nolock) 这样会提示用错误select * from a.dbo.table1 with (nolock) 这样就可以
发表评论
-
WITH (NOLOCK)
2014-09-28 11:56 578http://www.cnblogs.com/henw/arc ... -
SQL Server Profiler使用方法
2014-05-21 16:55 614http://lyt7599.blog.163.com/blo ... -
SQL Server Error Message
2014-05-20 20:20 1292http://www.sql-server-helper.co ... -
SQL锁的概述
2014-05-16 14:39 406http://blog.csdn.net/htl258/art ... -
SET...
2013-12-31 11:16 319http://msdn.microsoft.com/en-us ... -
DATE
2013-12-30 15:23 452http://blog.csdn.net/dba_huangz ... -
DATE AND TIME
2013-12-30 14:22 555SELECT (CAST((SELECT SUBSTRING( ... -
Microsoft SQL Server, Error:9002
2013-09-25 17:48 1031一般在建立一个database之后,就应该手动设置其日志的增长 ... -
EXISTS AND NOT EXISTS
2013-07-16 14:51 467EXISTS或者NOT EXISTS是把主查询的字段传到后边的 ... -
is invalid in the select list because it is not contained in either an aggregate
2013-07-11 10:37 940当select 语句块中出现function与常列时,需要在w ... -
A interesting article for printing statement in sql
2013-07-09 11:57 430http://bytes.com/topic/sql-serv ... -
Good net website blog for Database
2013-07-09 11:53 799http://www.bluegecko.net/mysql/ ... -
how to search a function or sto in database
2013-07-08 14:02 682SELECT * FROM sysobjects WHERE ... -
Good SQL WEBSITE 细说Sql Server中的视图(上)(更新)
2013-07-08 11:38 516http://www.cnblogs.com/xbf321/a ... -
SQLServer : EXEC和sp_executesql的区别
2013-07-08 11:36 549http://www.cnblogs.com/xbf321/a ... -
Search for a stored procedure
2013-07-08 11:27 635September 3, 2007 by Pinal Dave ... -
TRUNCATE TABLE
2013-06-27 10:43 473默认情况下,IDENTITY_INSER就是off 这种情况下 ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
2013-06-18 14:08 546http://www.cnblogs.com/freshman ... -
安装了SQL以后,编写SQL语句没有提示
2013-06-18 09:55 575安装了SQL以后,编写SQL语句没有提示解决办法: 工具— ... -
局部临时表VS全局临时表
2013-06-13 14:37 3662http://blog.csdn.net/wu_qiongle ...
相关推荐
"SQL Server 锁机制详解" SQL Server 中的锁机制是为了提供并发控制,防止多个事务同时访问同一个资源时出现的问题。锁机制可以分为悲观锁和乐观锁两种。 悲观锁是一种保守的锁机制,为任何操作(即使是 select)...
#### 三、SQL优化技巧详解 ##### 1. 避免使用`SELECT *` 使用`SELECT *`可能会导致不必要的网络传输负担,尤其是在应用和数据库不在同一台服务器的情况下。最佳实践是只选取实际需要的字段,以减轻网络负载。 - *...
使用`SELECT * FROM table WITH (NOLOCK)`,SQL Server在执行查询时不会施加任何锁,允许读取未提交的数据(脏读),这等同于设置事务隔离级别为`READ UNCOMMITTED`,可能会导致不一致的数据读取。 4. **UPDLOCK**...
CREATE TABLE tab_new AS SELECT col1, col2 FROM tab_old WITH(NOLOCK); ``` **6. 删除表** ```sql DROP TABLE tabname; ``` 此命令用于删除指定的表。 **7. 增加列** ```sql ALTER TABLE tabname ADD column_...
- **锁定提示**:使用`WITH (NOLOCK)`等提示减少锁定范围。 - **超时设置**:为事务设置合理的超时时间,超时后自动回滚事务,释放资源。 - **死锁图分析**:通过查看SQL Server生成的死锁图来了解死锁的具体原因,...
### SQLservices锁表查询知识点详解 #### 一、SQL服务中的锁机制理解 在数据库管理系统中,锁(Lock)是一种非常重要的并发控制机制,用于确保数据的一致性和完整性。SQL Server 使用锁来管理多个用户对同一资源...
FROM tab_old WITH (NOLOCK); ``` - **注意事项**: - 确保新表的列名与数据类型正确无误。 - 当使用 `LIKE` 或 `AS SELECT` 方法时, 需要注意源表与目标表之间的兼容性。 #### 5. 删除表 - **SQL语句**: ```...
包括但不限于:使用WITH(NOLOCK)来提高查询性能,但可能会读取到未提交的数据;使用TRY...CATCH处理错误;使用GO分隔T-SQL语句等。 ### 简单的数据拆分 数据拆分通常是指将一个表中的数据按照某种规则拆分到多个表...
### C#连接与操作SQL Server数据库及锁机制详解 #### 一、多程序并发更新同一行的不同字段 在多线程或多程序环境下,确保数据的一致性和完整性是非常重要的。当多个程序试图同时更新数据库表中同一行的不同字段时...
FROM 表名称 PN WITH(NOLOCK) JOIN #Temp T ``` 13. **数据操作:查询、插入、删除、聚合函数** - 查询:`SELECT * FROM table` 获取表的所有数据。 - 插入:`INSERT INTO new_table(id, name) VALUES(1, '...
WITH (NOLOCK)`或`UPDLOCK`等提示,减少锁的竞争。 4. **资源粒度细化**:减少锁的粒度,让事务尽可能少地锁定数据,降低死锁的概率。 5. **死锁检测与处理**:定期检查数据库状态,当检测到死锁时,主动回滚事务,...
### 52条SQL语句性能优化策略详解 #### 一、引言 数据库查询优化是提高应用程序性能的关键环节之一。对于使用MySQL等关系型数据库的应用而言,掌握有效的SQL语句编写技巧至关重要。本文旨在通过对《52条SQL语句....
### SQL的UPDATE语句详解及应用 #### 一、概述 在数据库管理中,SQL(Structured Query Language)作为处理和管理关系型数据库的标准语言,在数据的增删改查等方面发挥着重要作用。其中,`UPDATE`语句是用于修改已...
FROM Orders (NOLOCK) ) SELECT RowNum, OrderID, CustomerID, EmployeeID, OrderDate FROM RowNumberedOrders WHERE RowNum BETWEEN 1 AND 10; ``` 在这个示例中,`ROW_NUMBER()`函数为每个员工的订单分配了一个...
#### 一、SQL Server 2008 锁机制详解 ##### 1.1 SELECT * FROM table WITH (HOLDLOCK) `SELECT * FROM table WITH (HOLDLOCK)` 是SQL Server 2008中的一个非常重要的特性,该命令用来对数据行进行锁定,直到事务...
此外,通过`WITH(NOLOCK)`提示,避免了读取数据时的锁竞争,进一步提升了查询速度。 #### 结论 全文搜索存储过程是数据库技术中的高级应用,它结合了全文搜索、存储过程、数据类型选择、性能优化等多种技术。通过...
SELECT * FROM A WITH (NOLOCK) WHERE ID BETWEEN 31 AND 40 ``` 注意:如果ID不是连续的,这仍会选取ID在31到40之间的所有记录。 5. 页面间传递值的几种方式: - URL参数传递 - Session存储 - QueryString ...