如何做到这样的效果?
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




