一直一来我没能比较完美的解决SQLServer里的并发问题解决,找了很多次资料,
一直没能找到我想要得到的文章,或者解决核心问题的文章,现在我先承认自己这
方面我不行,然后向大家学习一下,提高一下。
只是一个人写程序,运行一份,那基本上是很少遇到这样的问题,若多个程序,多
个人同时访问一个SQLServer的库,那并发问题如何解决?
例如这个商业逻辑里,要运行N个SQL语句,需要进行锁定工作,我一直不会这个如何完美的处理。
Oracle 数据库里如何处理,我是会的,而且用得很熟练, FOR UPDATE NOWAIT 真的很强大。
谁能给我点破一下SQLServer里如何完美的解决,我真的是又提高了,这个问题一直困扰了我很多
年了。
大家别生气,我又发了一个首页,这个问题,应该是也困扰了很多人的,很多人也应该没能得到解决吧。
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。
posted on 2009-05-05 11:41 不仅仅是通用权限设计 阅读(556) 评论(18) 编辑 收藏
评论
1531820#2楼 回复 引用 查看
支持。。#3楼 回复 引用
开始那段什么“承认不会”的太无聊了#4楼 回复 引用
哈哈,sql server 2008应该支持啦mysql 5都支持行锁了
所以解决方案是:升级到sql 2008
或者换mysql
#5楼 回复 引用
--引用--------------------------------------------------Ryan Gene: 开始那段什么“承认不会”的太无聊了
--------------------------------------------------------
同意
#6楼[楼主] 回复 引用 查看
那到底应该怎么处理呢?#7楼 回复 引用
--引用--------------------------------------------------yeml: 哈哈,sql server 2008应该支持啦
mysql 5都支持行锁了
所以解决方案是:升级到sql 2008
或者换mysql
--------------------------------------------------------
sql05一样有行锁,区域锁,提高数据库并发能力有多种解决方案的,简单的如降低事务隔离级别、做数据库快照等,数据量再大的话就需要库表散列、读写分离,都需要对数据存储原理有一定理解才容易解决各种性能问题。个人感觉楼主很假
#8楼 回复 引用
不晓得FOR UPDATE NOWAIT强大在哪里,高粒度锁并不适用于大并发环境#9楼 回复 引用 查看
我处理的方式是在更新时加事务,如果是多人对同一个内容更新,那就只有以最后一个为准了,如果这样不合适,其他的我也不知道还有什么好办法了。#10楼 回复 引用
--引用--------------------------------------------------路过。。。: 不晓得FOR UPDATE NOWAIT强大在哪里,高粒度锁并不适用于大并发环境
--------------------------------------------------------
路过同学,你指的高粒度是啥意思?
select for update是细粒度的,不知道是不是你说的高粒度的意思
楼主说的没错,select for update 是个不错的feature,在某些场合挺好用的
不然只能在线程级别做同步(代码这一级),性能会差一些的
或者不在代码做同步,采用数据库的页锁,也可以
#11楼 回复 引用
@yeml,抱歉,对orcl了解不多,for update应该是行级独占锁,mssql的select默认就会加共享锁,和独占锁互斥,这些只是控制锁粒度的简单实现,在各大数据库产品上都有相应方案,实在没什么强大的#12楼 回复 引用 查看
用2005吧 之前的版本是没有办法的 如果是有查询引起的死锁,那么可以加 No_lock(好像是这么拼写的)。不过这样是有一定风险的,在处理数据的时候。如果只是查询还好#13楼 回复 引用 查看
我也关注这个#14楼 回复 引用 查看
sql server™支持 sql-92 中定义的事务隔离级别,那么用设置事务隔离级别来实现,应该是可以的,我没试过,楼主可以找这方面入手试试。#15楼 回复 引用 查看
类似这种SQL语句set transaction isolation level repeatable read
go
begin transaction
select * from publishers
select * from authors
commit transaction
#16楼 回复 引用
传统方法是TIMESTAMP (for update). 我猜这可以应用在任何数据库上.先来先得, 后动手的改动就被强行抛弃, 必须重新查询操作。
一般并发冲突不多, 所以不会造成什么大问题
#17楼 回复 引用
SQL Server中有 table hint:updlock#18楼 回复 引用
select top 1 @CardNo=F_CardNofrom Card with (UPDLOCK) where F_Flag=0
那个 with (UPDLOCK) 就是你要的