Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C++ Bulder > sqlserver锁机制(摘抄)
【标  题】:sqlserver锁机制(摘抄)
【关键字】:sqlserver
【来  源】:http://www.cnitblog.com/flyinggoal/archive/2006/12/22/20963.html

sqlserver锁机制(摘抄)

Your Ad Here 通常我们在进行数据库的新增、修改、删除、查询的时候如果我们面对的不是多个用户也及时单机处理的时候,一般我们基本上不需要考虑数据库的表锁定以及死锁之类情况,但是如果我们面对的是多用户的并行处理的网络环境的时候我们对表锁定的问题就需要较为仔细的分析和考虑,否则他给我们带来的麻烦就不言而喻了,下面就把我的在这件事情上遇到的问题以及解决办法同大家一起分享。
  
  也是在我的开发过程当中有这样的事情:
  
  两个用户同时保存新增的数据,我们的程序开始是这样处理
  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
黑客系列知识之不要小看了ping命令:【上一篇】
MATLAB? Compiler 4.5 Support for MATLAB and Toolboxes:【下一篇】
【相关文章】
  • 分析及解决SQLServer死锁问题
  • 分析及解决SQLServer死锁问题(续)
  • 查找[Microsoft][SQLServer 2000 Driver for JDBC]Broken pipe问题所看到的
  • sqlserver 数据类型
  • WinForm设计之SQLServer登录窗体
  • sqlserver2000悲观与乐观锁定
  • 查询SqlServer 2005的表结构
  • C#中结合使用SQLDMO实现备份、还原SQLserver数据库
  • 《sqlserver 性能调整技术指南》读后
  • SQLSERVER海量数据库的查询优化及分页算法方案
  • 【随机文章】
  • 格式化System.currentTimeMillis()
  • 波斯王子!
  • 版本管理
  • ECC加密算法入门介绍
  • 用awk数组处理两个文件的例子 (mocou)
  • RFID的现状与今后动向 - 1.3 RFID标签的分类
  • .NET中数组的隐秘特性
  • 试了一下XFire中把obj映射为xml的能力。
  • @_@让eva在设定的时间自动启动并登录(这下,帐号密码可以随意输入啦)
  • 架設 DNS(DNS终结篇)[2]
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.