多年困扰我的一个技术问题,希望这方面的专家指点一下,有关SQLServer并发控制方面的问题

来源:互联网 发布:日语网络怎么说 编辑:程序博客网 时间:2024/04/27 20:19

一直一来我没能比较完美的解决SQLServer里的并发问题解决,找了很多次资料,
一直没能找到我想要得到的文章,或者解决核心问题的文章,现在我先承认自己这
方面我不行,然后向大家学习一下,提高一下。

只是一个人写程序,运行一份,那基本上是很少遇到这样的问题,若多个程序,多
个人同时访问一个SQLServer的库,那并发问题如何解决?

例如这个商业逻辑里,要运行N个SQL语句,需要进行锁定工作,我一直不会这个如何完美的处理。

Oracle 数据库里如何处理,我是会的,而且用得很熟练, FOR UPDATE NOWAIT 真的很强大。

谁能给我点破一下SQLServer里如何完美的解决,我真的是又提高了,这个问题一直困扰了我很多
年了。

大家别生气,我又发了一个首页,这个问题,应该是也困扰了很多人的,很多人也应该没能得到解决吧。

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

posted on 2009-05-05 11:41 不仅仅是通用权限设计 阅读(556) 评论(18) 编辑 收藏

评论

#1楼  回复 引用 查看    建议在博问(http://space.cnblogs.com/q)中提问。

2009-05-05 11:50 | 博客园团队      

#2楼  回复 引用 查看   

支持。。
2009-05-05 11:50 | KSpring      

#3楼  回复 引用   

开始那段什么“承认不会”的太无聊了
2009-05-05 11:50 | Ryan Gene

#4楼  回复 引用   

哈哈,sql server 2008应该支持啦

mysql 5都支持行锁了

所以解决方案是:升级到sql 2008
或者换mysql
2009-05-05 11:56 | yeml[未注册用户]

#5楼  回复 引用   

--引用--------------------------------------------------
Ryan Gene: 开始那段什么“承认不会”的太无聊了
--------------------------------------------------------

同意
2009-05-05 11:57 | yeml[未注册用户]

#6楼[楼主]  回复 引用 查看   

那到底应该怎么处理呢?
2009-05-05 12:06 | 吉日嘎拉      

#7楼  回复 引用   

--引用--------------------------------------------------
yeml: 哈哈,sql server 2008应该支持啦

mysql 5都支持行锁了

所以解决方案是:升级到sql 2008
或者换mysql
--------------------------------------------------------
sql05一样有行锁,区域锁,提高数据库并发能力有多种解决方案的,简单的如降低事务隔离级别、做数据库快照等,数据量再大的话就需要库表散列、读写分离,都需要对数据存储原理有一定理解才容易解决各种性能问题。个人感觉楼主很假
2009-05-05 12:10 | 路过。。。[未注册用户]

#8楼  回复 引用   

不晓得FOR UPDATE NOWAIT强大在哪里,高粒度锁并不适用于大并发环境
2009-05-05 12:21 | 路过。。。[未注册用户]

#9楼  回复 引用 查看   

我处理的方式是在更新时加事务,如果是多人对同一个内容更新,那就只有以最后一个为准了,如果这样不合适,其他的我也不知道还有什么好办法了。
2009-05-05 12:39 | 常绍新      

#10楼  回复 引用   

--引用--------------------------------------------------
路过。。。: 不晓得FOR UPDATE NOWAIT强大在哪里,高粒度锁并不适用于大并发环境
--------------------------------------------------------

路过同学,你指的高粒度是啥意思?

select for update是细粒度的,不知道是不是你说的高粒度的意思

楼主说的没错,select for update 是个不错的feature,在某些场合挺好用的

不然只能在线程级别做同步(代码这一级),性能会差一些的

或者不在代码做同步,采用数据库的页锁,也可以
2009-05-05 15:21 | yeml[未注册用户]

#11楼  回复 引用   

@yeml,抱歉,对orcl了解不多,for update应该是行级独占锁,mssql的select默认就会加共享锁,和独占锁互斥,这些只是控制锁粒度的简单实现,在各大数据库产品上都有相应方案,实在没什么强大的
2009-05-05 16:10 | 路过。。。[未注册用户]

#12楼  回复 引用 查看   

用2005吧 之前的版本是没有办法的 如果是有查询引起的死锁,那么可以加 No_lock(好像是这么拼写的)。不过这样是有一定风险的,在处理数据的时候。如果只是查询还好
2009-05-05 16:56 | 阿水      

#13楼  回复 引用 查看   

我也关注这个
2009-05-05 17:51 | 温景良(Jason)      

#14楼  回复 引用 查看   

sql server™支持 sql-92 中定义的事务隔离级别,那么用设置事务隔离级别来实现,应该是可以的,我没试过,楼主可以找这方面入手试试。
2009-05-07 10:58 | 么玉顺      

#15楼  回复 引用 查看   

类似这种SQL语句
set transaction isolation level repeatable read
go
begin transaction
select * from publishers
select * from authors

commit transaction
2009-05-07 11:04 | 么玉顺      

#16楼  回复 引用   

传统方法是TIMESTAMP (for update). 我猜这可以应用在任何数据库上.

先来先得, 后动手的改动就被强行抛弃, 必须重新查询操作。

一般并发冲突不多, 所以不会造成什么大问题
2009-05-10 05:10 | superdigua

#17楼  回复 引用   

SQL Server中有 table hint:updlock
2009-05-12 21:18 | guoguo2008[未注册用户]

#18楼  回复 引用   

select top 1 @CardNo=F_CardNo
from Card  with (UPDLOCK) where F_Flag=0
那个 with (UPDLOCK) 就是你要的
原创粉丝点击