我的一亩三分地 我就喜欢!
13fen  设为主页
 收藏本站
 
当前位置: > 一亩三分地:首页 > 网络学院 > 数据库 > SQL Server > SQLSERVER的锁
热门文章排行
热门文章排行 服务器应用:用serv-u建立FTP一(11-16)
破解局域网内不能互访的六大经典问题(12-28)
启动与关闭服务器(12-28)
服务器架站务实:零起步学FTP概念篇(11-22)
使用WindowsXP及IIS5.1配置Web服务器(11-22)
精采文章排行
精采文章排行 SQL Server 2000企业版安装教程(1)(11-16)
SQL数据操作基础(初级1)(11-16)
SQL数据操作基础(中级1)(11-16)
mssql 数据库的备份与恢复(11-16)
在Windows Server 2003中为Web站点(11-16)
技术专题推荐
网管论坛交流
 

SQLSERVER的锁 

作者:佚名   来源:Linux 宝库   点击:   日期:2006-11-22


-->


  通常我们在进行数据库的新增、修改、删除、查询的时候如果我们面对的不是多个用户也及时单机处理的时候,一般我们基本上不需要考虑数据库的表锁定以及死锁之类情况,但是如果我们面对的是多用户的并行处理的网络环境的时候我们对表锁定的问题就需要较为仔细的分析和考虑,否则他给我们带来的麻烦就不言而喻了,下面就把我的在这件事情上遇到的问题以及解决办法同大家一起分享。
  
  也是在我的开发过程当中有这样的事情:
  
  两个用户同时保存新增的数据,我们的程序开始是这样处理
  cn.BeginTrans
  cn.Execute "insert into tableA ....."
  Set rs = cn.Execute("select count(*) from tableA where ...")
  If rs.RecordCount > 0 Then
  '表A 的字段A不能从复
  cn.RollbackTrans
  Else
  cn.CommitTrans
  End If
  
  当SQL SERVER 在执行INSERT 命令时如果我们不添加任何参数时 数据库默认申请一个 IX 锁 给表A这时候我们来分析上面的程序,当第一个用户执行 cn.Execute "insert into tableA ....." Connection
  向数据库申请了一个 IX 锁 给表A ,与此同时当第二个用户执行 cn.Execute "insert into tableA ....." Connection 也向数据库也成功地申请了一个 IX 锁 给表A ,但是当执行
  Set rs = cn.Execute("select count(*) from tableA where ...")
  这一句的时候就会有问题产生,我们假设第一个用户先一步执行 ,由于SELECT命令需要向数据库申请一个
  S 锁给表A,但是由于这时候表A已经存在一个IX锁并且属于另外一个连接因此他只好在此等候。紧接着第二个
  用户也执行
  Set rs = cn.Execute("select count(*) from tableA where ...")
  他也会向数据库申请一个S 锁给表A ,这时候数据就会自动结束较晚申请IX锁的连接同时回滚这个事务
  这样子对于我们的应用来说就是一个很大的失败。
  
  解决的办法一,设置数据参数让我们可以读取没有提交的数据、
  
  cn.BeginTrans
  cn.Execute "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED "
  cn.Execute "insert into tableA ....."
  Set rs = cn.Execute("select count(*) from tableA where ...")
  If rs.RecordCount > 0 Then
  '表A 的字段A不能从复
  cn.RollbackTrans
  Else
  cn.CommitTrans
  End If
  cn.Execute "SET TRANSACTION ISOLATION LEVEL READ COMMITTED "
  
  解决的办法二,设置INSERT 命令 参数 with (tablock) 、
  
  cn.BeginTrans
  cn.Execute "insert into tableA with (tablock) ....."
  Set rs = cn.Execute("select count(*) from tableA where ...")
  If rs.RecordCount > 0 Then
  '表A 的字段A不能从复
  cn.RollbackTrans
  Else
  cn.CommitTrans
  End If
  
  解决的办法三,增加一个没有用Lock 表、
  
  cn.BeginTrans
  cn.Execute "update tmpLockTable set FieldLock=1"
  cn.Execute "insert into tableA with (tablock) ....."
  Set rs = cn.Execute("select count(*) from tableA where ...")
  If rs.RecordCount > 0 Then
  '表A 的字段A不能从复
  cn.RollbackTrans
  Else
  cn.CommitTrans
  End If
  







文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   相关文章:
·Oracle数据库的安全策略分析(三) ·Oracle数据库的安全策略分析(二)
·SCO unix 下定时备份 Oracle dmp 文件 ·Oracle 9i密码策略--密码重用规则
·Oracle SQL 内置函数的使用方法及结果 ·WindowsXP下安装Oracle9i问题二则

   文章评论:(条)
  
 请留名: 匿名评论   点击查看所有评论 网管论坛
 

  责任编辑:一分  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。