研究Oracle的同学都知道,Oracle的select语句中可以使用for update或者for update nowait来控制并发,这一功能可以使开发人员轻易的将锁定控制在会话级+行级,可以说是高度并发的利器。

而在SQLSERVER中却没有如此功能,但很多开发人员,尤其是WEB开发人员,大都遇到过类似情况,比如电商中的秒杀,程序需要先读一下表中的那条记录(比如待售商品),如果存在,那么,马上去购买,即update操作,但要防止很多人同时读到了记录,否则将会出现意想不到的问题。所以,如果数据库是oracle,相信实现起来比较容易一些,但如果是SQLSERVER的话,就要困难一些,那么能否让SQLSERVER也实现上述功能呢,如果表中的数据量不是很大,我建议大家这样操作,人工使用表级锁定,方法如下:

--1.为了稳妥,先要确认一下事务隔离级别:

--2.使用显式事务,并且使用手工指定表级锁定。

begin transaction
select * from ls1 with (tablockx) where f_account_id=37
....
....

update ls1 set .....

commit;

--这样就可以了,之所以要使用手工指定表级锁定,因为在所有表锁定提示关键字中,只有tablockx是排它的,共享锁和更新锁是没有办法阻塞住其他用户对同一记录的查询的。因此退而求其次,只得使用表级排它锁了。如果表中的记录数量很多,这个方法显然不可行的,请大家使用时一定注意。

--当然还有另一种方法,只是将排它锁限定到行级,但却要求所有的查询语句全部手工指定锁定级别,如下所示:

--所有查询语句均使用表提示with(rowlock,xlock)

begin transaction

select * from ls1 with (rowlock,xlock) where f_account_id=37

update ls1 set .....

commit;

--注意上述表提示语句不能阻止共享锁,但可以阻止其他排它锁,只要所有的查询语句,在查询时全部带上with (rowlock,xlock)即可。

转自【新浪博客】【还在路上121】

用锁实现SQLSERVER中简单并发控制(转)的更多相关文章

  1. sqlserver中的锁与事务

    以下内容整理自: SQL Server中的锁 SQLSERVER中的元数据锁 SQLSERVER中的锁资源类型 浅谈sqlserver中的事务和锁 锁的分类 1.从数据库角度 独占锁(排它锁 X) 独 ...

  2. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

  3. SQLSERVER中的元数据锁

    SQLSERVER中的元数据锁 网上对于元数据锁的资料真的非常少 元数据锁一般会出现在DDL语句里 下面列出数据库引擎可以锁定的资源 资源 说明 RID 用于锁定堆(heap)中的某一行 KEY 用于 ...

  4. Entity Framework 6 Code First 系列:无需修改实体和配置-在MySql中使用和SqlServer一致的并发控制

    无需修改实体和配置,在MySql中使用和SqlServer一致的并发控制.修改RowVersion类型不可取,修改为Timestamp更不可行.Sql Server的RowVersion生成一串唯一的 ...

  5. SQLSERVER中的假脱机spool

    SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...

  6. 知方可补不足~sqlserver中使用sp_who查看sql的进程

    回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...

  7. SQLServer中的死锁的介绍

    简介      什么是死锁? 我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 什么又是阻塞? 阻塞是 ...

  8. [转]NHibernate之旅(7):初探NHibernate中的并发控制

    本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 ...

  9. Linux驱动设备中的并发控制

    一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使 ...

随机推荐

  1. PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换

    本篇文章主要介绍了PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换 超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软件准备 软 ...

  2. 如何简单的编译v8动态库

    按照google v8的官方提供的方法,在国内,完成编译简直太难了. 还好nodejs提供离线编译能力,稍微改造一下可以从node源码中直接编译纯净的v8动态库. 直接把v8解压出来的py/gpy文件 ...

  3. 页面元素定位-----android真机

    一.移动终端开发者选项启用USB调试模式 二.USB线连接移动终端,CTRL+R启动DOS窗口,输入:adb devices,出现以下信息,说明连接成功 三.启动appium,配置appium相关信息 ...

  4. centos7安装oracle1201c

    root身份安装依赖包: yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*.i686 el ...

  5. vue 事件中的 .native

    vue组件添加事件@click.native native是什么? .native - 监听组件根元素的原生事件. 主要是给自定义的组件添加原生事件. 官网的解释: 你可能想在某个组件的根元素上监听一 ...

  6. python------模块基础【第二部分-time】------

    一.time UTC/GMT:世界时间 本地时间:本地时区时间 python中时间日期格式化符号: %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01- ...

  7. 老贾的幸福生活day6 整型和布尔值的转换 字符串讲解 for 循环简介

    整型和布尔值的转换: 整型: python 2 整型 int long(长整型) /获取的是整型 python 3 整型 int 获取的是浮点数(小数) 十进制转二进制: print(bin(36)) ...

  8. python3.6以后的新写法

    声明redis_store为StrictRedis 类型,值为None,用处:在别处调用时,如果redis_store仍为None,不会有提示(自动补全的提示),如果想要自动补全的提示则写成这样,函数 ...

  9. 【计数dp】Array Without Local Maximums

    参考博客:[CF1068D]Array Without Local Maximums(计数DP) [题意] n<=1e5 dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间 ...

  10. Socket-实例

    import socket,os,time server = socket.socket() server.bind(("localhost",9999)) server.list ...