当前位置:编程学习 > C#/ASP.NET >>

各位哥哥姐姐帮我解决一下这个简单的存储过程造成数据库死锁的原因!!!

create PROC P_InInwarehouse_By_Buy_orderfm        
(        
@Product_code varchar(50),        
@InAmount int,        
@Reg_person varchar(50),        
@NewAttch_code varchar(100),        
@NewEquip_code varchar(100),        
@NewWaste_code varchar(100),        
@NewInfm_code varchar(100)        
)        
as        
declare @Orderfm_code varchar(100),@Product_name varchar(50),@Product_type varchar(50),@spec varchar(50),@unit varchar(50),@Amount int,@price numeric(13,4),@BOL_sum numeric(13,4),@remark varchar(100),@name varchar(100),@attchCount int,@equipCount int,@wasteCount int,@Infm_code varchar(100),@error int,@Incount int,@Afford_code varchar(50)
set @Afford_code=''
set @Incount=0     
set @error=0        
set @Infm_code=''        
set @wasteCount=0        
set @equipCount=0        
set @attchCount=0        
set @name=''        
set @remark=''        
set @price=0        
set @BOL_sum=0        
set @Amount=''        
set @unit=''        
set @spec=''        
set @Product_type=''        
set @Product_name=''        
set @Orderfm_code=''        
begin        
  begin transaction trn_example                
  save transaction stk_savePoint              
 select @Orderfm_code=Orderfm_code,@Product_name=Product_name,@Product_type=Product_type,@spec=spec,@unit=unit,@Amount=Amount,@price=Price,@BOL_sum=BOL_sum,@remark=remark from Buy_orderfm_list where Product_code=@Product_code   
  select @Incount=count(1) from Inwarehouse_fm_list where Infm_code in(select infm_code from  Inwarehouse_fm where Bill_code=@Orderfm_code) and Product_code=@Product_code      
  if(@incount>0)    
    begin            
 select 'yiruku'              
     rollback transaction stk_savePoint              
     commit transaction              
  end            
 select @name=Name from Buy_orderfm where Orderfm_code=@Orderfm_code        
 --添加/修改商品库存         
 if(@Product_type='1')        
 begin        
  select @attchCount=count(1) from Basedata_attch where attch_code=@Product_code        
  if(@attchCount>0)        
  begin        
  update Basedata_attch set Amount=Amount+@InAmount where attch_code=@Product_code        
  set @error=@error+@@error            
  end        
  else        
  begin        
  insert into Basedata_attch values(@NewAttch_code,@Product_name,'','','','','',@spec,@unit,'',@InAmount,'',0,100,@remark,@Reg_person,getdate(),@price,@BOL_sum,0)        
  set @error=@error+@@error             
 end        
  --select * from Basedata_attch        
 end        
 if(@Product_type='2')        
 begin        
  select @equipCount=count(1) from Basedata_equip where equip_code=@Product_code        
  if(@attchCount>0)        
  begin        
  update Basedata_equip set Amount=Amount+@InAmount where equip_code=@Product_code        
  set @error=@error+@@error         
  end           
  else        
  begin        
  insert into Basedata_equip values(@NewEquip_code,@Product_name,'','','','','',@spec,@unit,'',@InAmount,'',0,100,@remark,@Reg_person,getdate(),@price,@BOL_sum,0)        
  set @error=@error+@@error         
  end            
  --select * from Basedata_equip        
 end        
 if(@Product_type='3')        
 begin        
  select @wasteCount=count(1) from Basedata_waste where waste_code=@Product_code        
  if(@wasteCount>0)        
  begin        
  update Basedata_waste set Amount=Amount+@InAmount where waste_code=@Product_code        
  set @error=@error+@@error            
  end        
  else        
  begin        
  insert into Basedata_waste values(@NewWaste_code,@Product_name,'','','','','',@spec,@unit,'',@InAmount,'',0,100,@remark,@Reg_person,getdate(),@price,@BOL_sum,0)        
  set @error=@error+@@error             
  end        
  --select * from Basedata_equip        
 end        
 select @Afford_code=Afford_code from Buy_orderfm where  Orderfm_code=@Orderfm_code
 --添加入库表      
 insert into Inwarehouse_fm values(@NewInfm_code,'采购',@Afford_code,@Orderfm_code,@name,@Reg_person,getdate(),0)        
 set @error=@error+@@error          
 select top 1 @Infm_code=Infm_code from Inwarehouse_fm where Bill_code=@Orderfm_code order by Reg_time desc      

 insert into Inwarehouse_fm_list values(@Product_code,@Infm_code,@Product_name,@spec,@unit,@InAmount,@price,@BOL_sum,@Product_type,@remark,0,0)        
 set @error=@error+@@error         
    
   If @error>0                 
   begin                               
    rollback TransAction                     
    select 'no'                
    BEGIN TRANSACTION                
   end                 
  Else                
   Begin                 
              
    Commit TransAction      
select 'success'             
   End                    
end 数据库 存储 事务 --------------------编程问答-------------------- --------------------编程问答-------------------- 版主帮忙移到sql版块去吧 --------------------编程问答--------------------  有谁赶紧给我看看呗,急急急!!! --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 看的眼花缭乱,帮顶 --------------------编程问答-------------------- 砸还没人给我看看呀.亲哥亲姐们都去哪儿了~~~ --------------------编程问答-------------------- 这个存储过程直接在数据库执行也死锁吗? --------------------编程问答-------------------- 好乱。

  if(@incount>0)    
     begin            
       select 'yiruku'              
       rollback transaction stk_savePoint              
       commit transaction              
     end      

这个是,啥意思 --------------------编程问答-------------------- 反正就是结束掉,不用再运行下面的了,这块是不是有什么问题? --------------------编程问答--------------------
引用 8 楼 lyq8376 的回复:
这个存储过程直接在数据库执行也死锁吗?

楼主,您先看下 --------------------编程问答-------------------- 怎么看? --------------------编程问答--------------------
引用 11 楼 lyq8376 的回复:
引用 8 楼 lyq8376 的回复:这个存储过程直接在数据库执行也死锁吗?
楼主,您先看下

是的,我直接运行就死锁... --------------------编程问答-------------------- rollback transaction stk_savePoint     不要这个试一下 --------------------编程问答-------------------- 这东西看得头晕 --------------------编程问答--------------------  If @error>0                 
   begin                               
    rollback TransAction                     
    select 'no'                
    BEGIN TRANSACTION                
   end                 
  Else                
   Begin                 
              
    Commit TransAction      
select 'success'             
   End                    
把这句去掉,然后加上
Commit TransAction   试试 --------------------编程问答-------------------- 好简单的存储过程... --------------------编程问答-------------------- 用数据库调试工具吧。模拟参数进去 逐步调试 --------------------编程问答-------------------- 虽然不懂 但是感觉告诉我 问题就在这里

If @error>0                 
   begin                               
    rollback TransAction                     
    select 'no'                
    BEGIN TRANSACTION                
   end                 
  Else                
   Begin                 
              
    Commit TransAction      
select 'success'             
   End             --------------------编程问答--------------------
引用 17 楼 forever_code 的回复:
好简单的存储过程...

是简单的要命,哥耶,赶紧给我解决了吧 --------------------编程问答-------------------- 请注意,事务 本身异常,请 在 sql  自己捕获,不是所有的 数据库访问 库 都能捕获数据库异常 。
请 利用 异常处理机制 处理 混滚事务

比如: 前面 写写写

不用 管回滚,只在你认为 错误的地方 抛出 异常即可

eg:

begin        
  begin 事务                
  -----你要干的事情(中间也可以 之际抛出异常)
  commit 事务
  捕获 异常
  回滚事务

--不管成功与否 都请返回数据
--不是所有的 中间库都能 数据,最好使用 带输出参数 判断定
end 
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,