CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

如何做到这样的效果?

楼主fffddd(假钞换贞操)2006-04-24 19:23:38 在 MS-SQL Server / 应用实例 提问

Microsoft   OLE   DB   Provider   for   SQL   Server   错误   '80004005'    
   
  事务(进程   ID   132)与另一个进程已被死锁在   lock   资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。    
   
  csdn有时候会出现这样的提示。不知道是怎么实现的。 问题点数:20、回复次数:14Top

1 楼zjcxc(邹建)回复于 2006-06-12 09:02:55 得分 0

--设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'  
   
  --1)排它锁  
  --在第一个连接中执行以下语句  
  begin   tran  
        update   #tb  
        set   A='aa'  
        where   B='b2'  
        waitfor   delay   '00:00:3'     --等待3秒  
  commit   tran  
   
  --在第二个连接中执行以下语句  
  begin   tran  
        select   *   from   #tb  
        where   B='b2'        
  commit   tran  
  --若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒  
   
  --2)共享锁  
  --在第一个连接中执行以下语句  
  begin   tran  
        select   *   from   #tb   holdlock   --holdlock人为加锁  
        where   B='b2'    
        waitfor   delay   '00:00:3'     --等待3秒  
  commit   tran  
   
  --在第二个连接中执行以下语句  
  begin   tran  
        select   A,C   from   #tb  
        where   B='b2'    
        update   #tb  
        set   A='aa'  
        where   B='b2'        
  commit   tran  
  --若同时执行上述两个语句,则第二个连接中的select查询可以执行  
  --而update必须等待第一个连接中的共享锁结束后才能执行   即要等待30秒  
   
  --3)死锁  
  --增设tb2(D,E)  
  create   table   #tb2(D   varchar(2),E   varchar(2))  
  insert   into   #tb2  
  select   'd1','e1'  
  union   all   select   'd2','e2'  
   
  --在第一个连接中执行以下语句  
  begin   tran  
        update   #tb  
        set   A='aa'  
        where   B='b2'    
        waitfor     delay   '00:00:5'  
        update   #tb2  
        set   D='d5'  
        where   E='e1'    
  commit   tran  
         
  --在第二个连接中执行以下语句  
  begin   tran  
        update   #tb2  
        set   D='d5'  
        where   E='e1'    
        waitfor     delay   '00:00:3'  
        update   #tb  
        set   A='aa'  
        where   B='b2'      
  commit   tran  
   
  --删除临时表  
  drop   table   #tb,#tb2  
   
  --同时执行,系统会检测出死锁,并中止进程  
  /*-------------------------------------------------------------  
  SET   IMPLICIT_TRANSACTIONS     ON   --用户每次必须显式提交或回滚。否则当用户断开连接时,  
                                                              --事务及其所包含的所有数据更改将回滚  
   
  SET   IMPLICIT_TRANSACTIONS     OFF   --自动提交模式。在自动提交模式下,如果各个语句成功  
                                                                --完成则提交。  
  ------------------------------------------------------------------------*/  
   
  Top

2 楼jinliangliu(KingNa)回复于 2006-06-12 11:23:54 得分 0

作個記號﹗Top

3 楼fffddd(假钞换贞操)回复于 2006-06-13 00:16:24 得分 0

谢谢老大。我实验了之后来结贴。Top

4 楼shunzi110(顺子)回复于 2006-06-14 22:00:19 得分 0

分点分给我Top

5 楼fffddd(假钞换贞操)回复于 2006-07-28 23:08:18 得分 0

还是没明白。老大能不能再详细说说。  
   
  --同时执行,系统会检测出死锁,并中止进程  
   
   
  我的sql   2000里经常出现死锁,怎么我的系统不会检测出死锁并中止进程呢?Top

6 楼yanguangyun(my_21sj)回复于 2006-07-31 10:20:53 得分 0

检查一下看有没有反向操作.Top

7 楼xjchen(星际浪子)回复于 2006-08-04 16:18:38 得分 0

标记+接分Top

8 楼being21(民谣)回复于 2006-08-04 17:54:39 得分 0

标记+接分  
  !!!Top

9 楼guan0616(还想着管周周)回复于 2006-09-18 09:01:10 得分 0

谢谢   我也看了一遍Top

10 楼koposo(不知不是错,不问就是过)回复于 2006-09-18 22:21:27 得分 0

markTop

11 楼FEB15(张郎)回复于 2006-09-19 23:08:05 得分 0

markTop

12 楼wisdomone()回复于 2006-09-22 01:02:06 得分 0

upTop

13 楼akuzou(启航)回复于 2006-09-22 08:46:11 得分 0

值得学习Top

14 楼ALLEN625314()回复于 2006-09-26 08:27:41 得分 0

邹老大都出来了...我们就不说话了Top

相关问题

关键词

得分解答快速导航

  • 帖主:fffddd

相关链接

  • SQL Server类图书

广告也精彩

反馈

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