| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 数据库 > SQL Server教程 > 文章正文 用户登录
免费5G/PHP/mysql
XMLSocket 渐进 (
Flash声音高级篇:
Java与flash的TCP
local shared对象
mx.utils 包 [1] 
mx.utils 包 [2] 
mx.utils 包 [3] 
mx.utils 包 [4] 
Flex-Jsp-Mysql简

SQL SERVER的锁           

SQL SERVER的锁

作者:佚名 来源:不详 更新:2006-8-25 21:05:35 错误报告 我要投稿
 通常我们在进行数据库的新增、修改、删除、查询的时候如果我们面对的不是多个用户也
及时单机处理的时候,一般我们基本上不需要考虑数据库的表锁定以及死锁之类情况,但是如
果我们面对的是多用户的并行处理的网络环境的时候我们对表锁定的问题就需要较为仔细的分
析和考虑,否则他给我们带来的麻烦就不言而喻了,下面就把我的在这件事情上遇到的问题以
  也是在我的开发过程当中有这样的事情:
  两个用户同时保存新增的数据,我们的程序开始是这样处理
  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
  向数据库申请了一个 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
文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。