CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

请问各位都是怎么解决并发问题呢(sql server)

楼主wate(两个人的缠绵)2003-12-02 12:54:14 在 MS-SQL Server / 疑难问题 提问

例如:在火车售票系统中,当某次车只剩最后一张票的时候,有多个客户分别在不同的售票窗口购票,这时一张票不可能卖给两个人,用什么方法来保证这种并发操作呢,加锁吗?或者该怎么处理呢 问题点数:100、回复次数:13Top

1 楼mywhsw(bamboo)回复于 2003-12-02 13:09:37 得分 10

用一个标识,在选择那张票的时候先用  
  (Update   表   set   票flag=‘占用了!’   where   票flag=‘未占用’   and   ........)  
  这样是保险的,不可能存在并发问题,这就牵扯到sql锁机制问题了,你可以测试一下,其实sql中update是先查询出然后删除再添加,但由于使用了update,过程中就自动加锁了,很方便吧Top

2 楼welyngj(无爱)回复于 2003-12-02 13:09:41 得分 10

加锁。  
  Microsoft®   SQL   Server™   2000   使用锁定确保事务完整性和数据库一致性。锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁定,则数据库中的数据可能在逻辑上不正确,并且对数据的查询可能会产生意想不到的结果。  
   
  虽然   SQL   Server   自动强制锁定,但可以通过了解锁定并在应用程序中自定义锁定来设计更有效的应用程序。  
  Top

3 楼Leftie(左手,为人民币服务)回复于 2003-12-02 13:16:24 得分 10

用事务处理来控制Top

4 楼yoki(小马哥--鬓微霜,又何妨)回复于 2003-12-02 13:25:17 得分 5

用事务处理解决并发问题Top

5 楼leimin(黄山光明顶)回复于 2003-12-02 13:40:28 得分 5

通过事务来解决(其实就是LOCK)Top

6 楼datacen(datacen)回复于 2003-12-02 13:57:35 得分 10

用timestamp,解决lock的最常用方法Top

7 楼lvltt(未完成)回复于 2003-12-02 15:57:13 得分 10

--设tb(A,B,C)  
  create   table   #tb(A   varchar(2),B   varchar(2),C   varchar(2))  
  insert   into   #tb  
  select   'a1','b1','c1'  
  union   all   select   'a2','b2','c2'  
  union   all   select   'a3','b3','c3'  
   
   
  /**********     加锁       ***************  
  设table1(A,B,C)  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
   
  1)排它锁  
  新建两个连接  
  在第一个连接中执行以下语句  
  begin   tran  
        update   table1  
        set   A='aa'  
        where   B='b2'  
        waitfor   delay   '00:00:30'     --等待30秒  
  commit   tran  
  在第二个连接中执行以下语句  
  begin   tran  
        select   *   from   table1  
        where   B='b2'        
  commit   tran  
   
  若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒  
   
  2)共享锁  
  在第一个连接中执行以下语句  
  begin   tran  
        select   *   from   table1   holdlock   -holdlock人为加锁  
        where   B='b2'    
        waitfor   delay   '00:00:30'     --等待30秒  
  commit   tran  
   
  在第二个连接中执行以下语句  
  begin   tran  
        select   A,C   from   table1  
        where   B='b2'    
        update   table1  
        set   A='aa'  
        where   B='b2'        
  commit   tran  
   
  若同时执行上述两个语句,则第二个连接中的select查询可以执行  
  而update必须等待第一个连接中的共享锁结束后才能执行   即要等待30秒  
   
  3)死锁  
  增设table2(D,E)  
  D         E  
  d1       e1  
  d2       e2  
  在第一个连接中执行以下语句  
  begin   tran  
        update   table1  
        set   A='aa'  
        where   B='b2'    
        waitfor     delay   '00:00:30'  
        update   table2  
        set   D='d5'  
        where   E='e1'    
  commit   tran  
         
  在第二个连接中执行以下语句  
  begin   tran  
        update   table2  
        set   D='d5'  
        where   E='e1'    
        waitfor     delay   '00:00:10'  
        update   table1  
        set   A='aa'  
        where   B='b2'      
  commit   tran  
   
  同时执行,系统会检测出死锁,并中止进程  
  Top

8 楼txlicenhe(马可)回复于 2003-12-02 18:27:18 得分 10

 
   
  1   如何锁一个表的某一行  
   
   
  A   连接中执行  
   
  SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ  
   
  begin   tran  
   
  select   *   from   tablename   with   (rowlock)   where   id=3  
   
  waitfor   delay   '00:00:05'  
   
  commit   tran  
   
  B连接中如果执行  
   
  update   tablename   set   colname='10'   where   id=3   --则要等待5秒  
   
  update   tablename   set   colname='10'   where   id<>3   --可立即执行  
   
  2   锁定数据库的一个表  
   
  SELECT   *   FROM   table   WITH   (HOLDLOCK)    
   
   
  注意:   锁定数据库的一个表的区别  
   
  SELECT   *   FROM   table   WITH   (HOLDLOCK)    
  其他事务可以读取表,但不能更新删除  
   
  SELECT   *   FROM   table   WITH   (TABLOCKX)    
  其他事务不能读取表,更新和删除  
   
   
  SELECT   语句中“加锁选项”的功能说明  
      SQL   Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL   Server的缺省设置也可以在select   语句中使用“加锁选项”来实现预期的效果。   本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。  
      功能说明:     
      NOLOCK(不加锁)    
      此选项被选中时,SQL   Server   在读取或修改数据时不加任何锁。   在这种情况下,用户有可能读取到未完成事务(Uncommited   Transaction)或回滚(Roll   Back)中的数据,   即所谓的“脏数据”。    
       
      HOLDLOCK(保持锁)    
      此选项被选中时,SQL   Server   会将此共享锁保持至整个事务结束,而不会在途中释放。    
       
      UPDLOCK(修改锁)    
      此选项被选中时,SQL   Server   在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。    
       
      TABLOCK(表锁)    
      此选项被选中时,SQL   Server   将在整个表上置共享锁直至该命令结束。   这个选项保证其他进程只能读取而不能修改数据。    
       
      PAGLOCK(页锁)    
      此选项为默认选项,   当被选中时,SQL   Server   使用共享页锁。    
       
      TABLOCKX(排它表锁)    
      此选项被选中时,SQL   Server   将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。  
  Top

9 楼leecooper0918(爱一个人好难)回复于 2003-12-02 20:49:59 得分 0

To   楼上:   写的不错,收藏.  
   
  Top

10 楼pengdali()回复于 2003-12-02 20:51:46 得分 10

SET   TRANSACTION   ISOLATION   LEVEL   SERIALIZABLE  
   
  是为了防止在事务没有完成的时候另一用户,访问事务内,未提交的数据  
  create   table   Table1   (a   int)  
  go  
  SET   TRANSACTION   ISOLATION   LEVEL   SERIALIZABLE  
  begin   tran  
      insert   table1   values(1)                               ----这句在事物没有commit前,被另一个用户  
                                                                                  ----访问是错误的,应为下面有可能会出错  
   
      insert   table1   values('aaa')                       ----这句由于类型不一样将报错  
                                                                                  ----设置了SERIALIZABLE的话就不会发生脏读  
  commit   tran  
   
  select   *   from   table1Top

11 楼hgm13579(天山孤人)回复于 2003-12-02 21:26:54 得分 0

要不要这么麻烦?有没有简单些的方法???Top

12 楼CrazyFor(冬眠的鼹鼠)回复于 2003-12-02 22:18:58 得分 10

在打印票之前再次检查票是不是还没有卖掉,而不是在查询时就做这样的确认就行了.Top

13 楼qinqindodo(无奈朝来寒雨晚来风)回复于 2003-12-02 22:22:43 得分 10

其实在实际编程中,我使用存储过程来提交数据,提交前检验是否符合条件(与界面提供的数据是否相同,如果不是,就回滚)。也许比较土,不过在实际应用中还没有出现过问题。Top

相关问题

  • sql server并发操作问题,急!
  • Sql Server 2000 并发访问的问题
  • 高分求助 有关并发的问题,Tomcat5+SQL Server.
  • SQL Server的并发用户数或者license怎么理解?
  • 各版本的sql server数据库都能支持多少个并发连接?
  • SQL Server中,并发查询和查完一个再查一个,哪个平均效率高?
  • ASP+SQL SERVER,在处理多用户并发处理时应注意的问题有哪些?
  • ★★第一个解决的,200分全给他:怎样用Delphi程序创建sql server的合并发布?★★
  • 请问在VB+SQL SERVER做管理系统时,多个用户操作时怎样处理并发操作?
  • 請問各位SQL Server中跨server訪問的怪咚咚??

关键词

  • 选项
  • 语句
  • 数据
  • 执行
  • 数据库
  • 用户
  • 查询
  • 连接
  • 修改
  • 加锁

得分解答快速导航

  • 帖主:wate
  • mywhsw
  • welyngj
  • Leftie
  • yoki
  • leimin
  • datacen
  • lvltt
  • txlicenhe
  • pengdali
  • CrazyFor
  • qinqindodo

相关链接

  • SQL Server类图书

广告也精彩

反馈

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