也谈SQL SERVER 的锁

原创 2001年04月29日 11:43:00

 通常我们在进行数据库的新增、修改、删除、查询的时候如果我们面对的不是多个用户也及时单机处理的时候,
一般我们基本上不需要考虑数据库的表锁定以及死锁之类情况,但是如果我们面对的是多用户的并行处理的
网络环境的时候我们对表锁定的问题就需要较为仔细的分析和考虑,否则他给我们带来的麻烦就不言而喻了,
下面就把我的在这件事情上遇到的问题以及解决办法同大家一起分享。
也是在我的开发过程当中有这样的事情:
两个用户同时保存新增的数据,我们的程序开始是这样处理
    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

 

 

 

sql server锁知识及锁应用

sql server锁(lock)知识及锁应用 一 关于锁的基础知识 二 锁的分析及应用系列 三 SQL Server 锁机制 悲观锁 乐观锁 实测解析 四 SQL Server 中WITH NOLO...
  • huwei2003
  • huwei2003
  • 2017年04月01日 18:30
  • 26398

sql server锁的类型与锁机制

SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。     2. NOLOCK:不添加共享锁和排它锁...
  • hdhai9451
  • hdhai9451
  • 2013年07月11日 10:14
  • 2795

用例子来说明SQL Server的更新锁

1:首先创建表,插入数据: create table table1(A nchar(10) not null primary key,B nchar(10),C nchar(10)); inser...
  • u010523770
  • u010523770
  • 2016年11月18日 00:19
  • 785

SQL Server深入理解“锁”机制

相比于 SQL Server 2005(比如快照隔离和改进的锁与死锁监视),SQL Server 2008 并没有在锁的行为和特性上做出任何重大改变。SQL Server 2008 引入的一个主要新特...
  • 3150379
  • 3150379
  • 2017年02月26日 09:14
  • 939

SQL Server事务和锁

一、事务        事务就是将一些列事情看成一个整体,这些事情要么一起完成,要么就不完成。在SQL Server中的每一条单独的SELECT、UPDATE、INSERT和DELETE语句都是一个隐...
  • luozenghui529480823
  • luozenghui529480823
  • 2014年10月29日 15:50
  • 1147

sqlserver 锁表语句以及解锁语句

锁定数据库的一个表  SELECT * FROM table WITH (HOLDLOCK)  注意: 锁定数据库的一个表的区别  SELECT * FROM table...
  • LazyLeland
  • LazyLeland
  • 2013年11月29日 10:03
  • 14761

SQL处理并发之乐观锁

问题描述在使用mysql数据库存储数据的前提下,有一个抢任务系统,一个任务只能分配给n个人,如果有高并发请求,如何保证数据完整性?一般做法在不考虑到数据是否完整的情况下,我们一般只会按照以下思维开发:...
  • u010956470
  • u010956470
  • 2017年03月13日 14:16
  • 2097

SQL SERVER中事务和锁的简要理解

阅读本文前建议先对事务有过基本的了解,有使用过事务,听过“锁”这个概念,而且对事务和锁的概念一直不太清楚。 对于事务和锁的详细解说可以参考http://blog.csdn.net/happyflyst...
  • xxyj6450
  • xxyj6450
  • 2013年11月24日 01:11
  • 1286

SqlServer 并发事务(二):锁粒度和锁模式

锁粒度: 资源 格式 说明 DATABASE 不适用 resource_database_id 列中已提供数据库 ID。 FILE 此资源所表示的文件 ID。 Object 此...
  • kk185800961
  • kk185800961
  • 2014年11月27日 20:44
  • 4307

SQL Server数据库系列——锁和并发

最近在使用数据库,综合各方面原因,选择了SQL Server2008.为了对使用的工具有更加深入的了解,所以仔细地阅读了经典翻译书籍《SQL Server 2008高级程序设计》,在此将读书过程中的感...
  • walkman_lfq
  • walkman_lfq
  • 2016年07月20日 20:36
  • 1295
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:也谈SQL SERVER 的锁
举报原因:
原因补充:

(最多只允许输入30个字)