CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

并发问题!!!

楼主KingSeaMountain()2006-03-16 11:18:52 在 MS-SQL Server / 疑难问题 提问

我对sql   server   2000的并发控制不是很了解,所以想问一下,在以下代码中:  
  --*******************************************************************  
  ALTER     PROCEDURE   dbo.SetPublishNumber  
  (  
  @PublishID   uniqueidentifier  
  )  
  AS  
  SET   NOCOUNT   ON    
  update   Publishes  
  set   [PublishNumber]   =   dbo.GetNewestPublishNumber(getdate())  
  where   [ID]   =   @PublishID  
   
  RETURN    
   
  GO  
   
  ALTER     FUNCTION   dbo.GetNewestPublishNumber  
  (  
  @currentDate   datetime  
  )  
  RETURNS   nchar(7)  
  AS  
  BEGIN  
  declare   @MaxNumber   nchar(7)  
  select   @MaxNumber   =   Max([PublishNumber])    
  from   dbo.[Publishes]    
  --@@  
  --中间部分省略,就是根据年份计算一个最大的编号  
   
  RETURN   dbo.IntToFixedLengthString(@Year,   4)   +   dbo.IntToFixedLengthString(@Order,   3)  
  END  
   
  GO  
  --*************************************************************************  
   
  存储过程SetPublishNumber的执行总能成功吗?  
   
  sql   server中不同连接中的sql命令最终是排队在同一个线程中执行呢?还是每个连接分配一个线程并发执行?  
   
  如果是并发执行,假设两个并发的连接A和B同时执行存储过程SetPublishNumber,当A执行到位置--@@时,由于线程切换,运行A的线程被停止;接着运行B的线程开始执行,B能执行select   @MaxNumber   =   Max[PublishNumber])from   dbo.[Publishes]   这条语句吗?  
   
  谢谢  
   
  问题点数:50、回复次数:4Top

1 楼KingSeaMountain()回复于 2006-03-16 15:40:44 得分 0

...Top

2 楼wgsasd311(自强不息)回复于 2006-03-16 15:50:57 得分 25

存储过程SetPublishNumber的执行总能成功吗?  
  ===>  
  也会能失败  
   
  sql   server中不同连接中的sql命令最终是排队在同一个线程中执行呢?还是每个连接分配一个线程并发执行?  
  ====>  
  多线程并发执行  
   
  如果是并发执行,假设两个并发的连接A和B同时执行存储过程SetPublishNumber,当A执行到位置--@@时,由于线程切换,运行A的线程被停止;接着运行B的线程开始执行,B能执行select   @MaxNumber   =   Max[PublishNumber])from   dbo.[Publishes]   这条语句吗?  
  ====>  
  当然可以执行Top

3 楼KingSeaMountain()回复于 2006-03-16 18:11:36 得分 0

 
  那用什么语句、锁定什么对象,才能让SetPublishNumber的运行结果一定是正确的?  
  Top

4 楼efly75()回复于 2006-03-16 18:39:51 得分 25

你目前这种方式,高并发时肯定全有问题。 而且如果publisher表记录比较多(如几百万条),光取一个最大值都会很长时间。  
   
  建议:你可以另外加一个表,只有一个字段,记录数只有一条。每次取最大值时,就修改此记录,将其加一(注意,需要在where语句中加上原值的判断)。 这样,由于使用update语句,在你提交事务这前,别人是不能再修改加一的。  
   
  不过,这种方式,在并发数很高时(如几百个用户频繁调用),可能会出现堵塞的情况。但至少可以保证不会得到重复的ID。Top

相关问题

  • 并发控制
  • 并发控制?
  • 并发问题
  • XML并发问题
  • 并发的问题
  • ado并发问题
  • 关于并发控制???
  • sybase是否支持并发?
  • 数据库并发操作!
  • webservice的并发性问题

关键词

  • 执行
  • 线程
  • 语句
  • 存储过程
  • 连接
  • sql
  • 并发
  • setpublishnumber
  • publishnumber
  • maxnumber

得分解答快速导航

  • 帖主:KingSeaMountain
  • wgsasd311
  • efly75

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo