zoukankan      html  css  js  c++  java
  • 用锁实现SQLSERVER中简单并发控制(转)

    研究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】

  • 相关阅读:
    Windows抓屏技术
    几种常见的跨域技术
    实现圆角的3种方式
    svg基础
    nodejs基础(二)
    nodejs的基础(1)
    css3一些常见样式的兼容性处理
    JS中Array的使用
    浏览器的几种模式
    XHR2通信基础
  • 原文地址:https://www.cnblogs.com/MLGB/p/4164986.html
Copyright © 2011-2022 走看看