+ -
当前位置:首页 → 问答吧 → 死锁问题

死锁问题

时间:2011-11-07

来源:互联网

update table set hits=hits+1 where id='" + iTid + "'

程序里所有这样的语句容易造成死锁,不知道是什么原因?

作者: CIOSOFT   发布时间: 2011-11-07

你是不是循环执行这个语句?

作者: NBDBA   发布时间: 2011-11-07

打开这个页面时就执行一次。没有用到循环

作者: CIOSOFT   发布时间: 2011-11-07

id 是个varchar型的? 

上面是否有索引。

并发引起的。

作者: OrchidCat   发布时间: 2011-11-07

id是int,有索引

作者: CIOSOFT   发布时间: 2011-11-07

楼主是怎样确定是死锁的?

一般来讲单个语句构不成死锁,因为只有一个资源.

作者: ap0405140   发布时间: 2011-11-07

用SQL PROFILER查看一下 贴出你的死锁图看看。

作者: fredrickhu   发布时间: 2011-11-07

sp_who_lock

作者: gold_water   发布时间: 2011-11-07

重启服务后,现在没有发生了

作者: CIOSOFT   发布时间: 2011-11-07

引用 4 楼 ciosoft 的回复:

id是int,有索引


解决就好。如果有死锁的图,发上来看看最好。

作者: OrchidCat   发布时间: 2011-11-07

是不是锁升级了
由行锁升级到表锁之类的

作者: wufeng4552   发布时间: 2011-11-07

加在一个事物中,事物完成后,提交。

作者: zlp321002   发布时间: 2011-11-07

现在就是隔一段时间就出现一次,再出现了就上图

作者: CIOSOFT   发布时间: 2011-11-07

引用 4 楼 ciosoft 的回复:
id是int,有索引


既然id是int类型,where语句中等号右边的表达式最好也是int类型,否则会进行类型转换,可能就没用到索引了。

作者: chenzhuomin   发布时间: 2011-11-07

重现/模拟出楼主的问题,
SQL code

create table t (id int, descr char(8000) constraint pk_t primary key(id))

insert into t
select 1,'a' union all
select 2,'b' union all
select 3,'c'

-- 连线1中执行
begin tran
  update t set descr='a1' where id=1

-- 连线2中执行
begin tran
  update t set descr='c2' where id=3

-- 连线1中执行
  update t set descr='c1' where id=3

-- 连线2中执行
  update t set descr='a2' where id=1

-- 报死锁(deadlocked)错误
Msg 1205, Level 13, State 51, Line 1
Transaction (Process ID 56) was deadlocked on lock resources with another process 
and has been chosen as the deadlock victim. Rerun the transaction.

作者: ap0405140   发布时间: 2011-11-07

我觉得LZ应该没这么蛋疼这样嵌套事务
引用 14 楼 ap0405140 的回复:

重现/模拟出楼主的问题,
SQL code

create table t (id int, descr char(8000) constraint pk_t primary key(id))

insert into t
select 1,'a' union all
select 2,'b' union all
select 3,'c'

-- 连线1中执行
begin tran
up……

作者: geniuswjt   发布时间: 2011-11-08