用锁实现SQLSERVER中并发控制--实现Oracle中select .... for update功能

用锁实现SQLSERVER中并发控制--实现Oracle中select .... for update功能,第1张

概述http://blog.sina.com.cn/s/blog_548c08c80101aic8.html 研究Oracle的同学都知道,Oracle的select语句中可以使用for update或者for update nowait来控制并发,这一功能可以使开发人员轻易的将锁定控制在会话级+行级,可以说是高度并发的利器。   而在SQLSERVER中却没有如此功能,但很多开发人员,尤其是WEB开

http://blog.sina.com.cn/s/blog_548c08c80101aic8.HTML

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


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

总结

以上是内存溢出为你收集整理的用锁实现SQLSERVER中并发控制--实现Oracle中select .... for update功能全部内容,希望文章能够帮你解决用锁实现SQLSERVER中并发控制--实现Oracle中select .... for update功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/1171167.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存