易截截图软件、单文件、免安装、纯绿色、仅160KB

sql查询,nolock写还是不写,这是一个问题

在做过的很多项目中,发现大家不管对什么表,逢select必定加上nolock(或者with(nolock)),好像已经是制度化的一种东西。有领导高人解释说加上nolock可以提高查询速度,不影响对数据表的其他并发操作。  
  但是真有必要每个查询都加nolock吗?个人认为加不加nolock还是值得我们根据实际情况斟酌一番的(至少需要知其然然后知其所以然吧)。下面就来简单分析一下加不加nolock以及加了nolock对实际查询的一些影响。
一、重要概念
  (此处沉思5秒,安静回想经典数据库教科书里的一些重用概念。嗯......什么,你也想不全了?那好吧,别闲烦,道理是要讲的,书是不得不参考的(bs直接抄书的))
并发访问:同一时间有多个用户访问同一资源。如果并发用户中有其他用户同时对资源进行了修改,这样对同一数据的访问就会出现“所见不是所得”的情况,从而对其它用户产生某些不利的影响,包括:
1:脏读:有一个用户对某一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后第一个用户又放弃了修改,数据还原到修改之前,这两个不同的结果就是脏读。
2:幻读:特指用户读取一批记录的情况。用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据做了修改,方法可能是insert,update或delete,第二次查询时,用户会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中,造成前后查询结果的不一致。
3:不可重复读:系统中某一个用户的一个操作是一个事务,这个事务分两次读取同一条记录。如果第一次读取后,正好有另外一个用户修改了这条记录,然后第二次读取的正好是之前进行修改记录的那位用户的数据,这样就有可能造成两次读取的数据不同。当然如果我们在事务中锁定这条记录就可以避免。
二、如何消除并发访问的不利影响
  如前所述,既然并发访问会造成这么多不利影响,我们又该如何解决呢?估计一般程序员的下意识反应就是像我们在控制多线程并发编程的时候一样,加锁,lock一下,over。没错,还真不能说你说的不对!真是聪明又幸福的程序员啊!
其实在ms的Sql Server中,有两种并发访问的控制机制:锁和行版本控制,关于并发控制,ms的阐述和解决方案真是详细而周到。你不得不pf我们的ms是多么的亲妈啊,真的什么都帮我们想好并且做好了。
先分析一下数据库的锁。
小抄一段参考书上的:
1、锁:“每个事务对所依赖的资源会请求


相关文档:

贺州市疾病预防控制中心SQL server数据库置疑成功修复

贺州市疾病预防控制中心所用的ZmSoft从业体检信息网络系统V2010.1.26 正式版采用SQL SERVER2000平台,不明原因,数据库"置疑“,客户试过所有网上方法,未能解决.沈阳凯文数据恢复中心SQL数据库工程师成功将其解决.
沈阳凯文数据恢复中心MS SQL SERVER研发小组致力于MsSql数据库技术的研究。经过多年研究完全掌握了S ......

【转】采用p6spy完整显示hibernate的SQL语句

作者:邱洋
QQ:1964477
    虽然在hibernate中有show_sql选项,但是显示出来的语句大多类似
    select * from xxx where value=?
    但是有时候我们需要得到完整的SQL语句,怎么办呢?使用P6SPY就可以完成这个任务
    p6spy是一个开源软件,它可以跟 ......

找些不错的sql面试题(2)

问题描述:
本题用到下面三个关系表:
CARD     借书卡。   CNO 卡号,NAME  姓名,CLASS 班级
BOOKS    图书。     BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
BORROW   借书记录。 CNO 借书卡号,BNO 书号 ......

SQL Server 2005 无法删除数据库作业

遇到MS SQL Server 2005 无法删除数据库作业。
  首先,以sa账户登录,查看以下2个表的数据,如果不为空就有问题。
  Sql代码
  select * from msdb.dbo.sysmaintplan_subplans
  select * from msdb.dbo.sysmaintplan_log
  如果不为空,执行以下操作,基本上不用考虑删除哪一条记录,有问题的作业就 ......

c# 操作mssql数据库 含有带参数sql语句运行

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <appSettings>
  <add key="Default" value="Default" />
 </appSettings>
 <connectionStrings>
  <add name="Default" connectionString="Data Source=192.168.1.197;User ID ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号