各位哥哥姐姐帮我解决一下这个简单的存储过程造成数据库死锁的原因!!!
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
这个是,啥意思 --------------------编程问答-------------------- 反正就是结束掉,不用再运行下面的了,这块是不是有什么问题? --------------------编程问答--------------------
楼主,您先看下 --------------------编程问答-------------------- 怎么看? --------------------编程问答--------------------
是的,我直接运行就死锁... --------------------编程问答-------------------- 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 --------------------编程问答--------------------
是简单的要命,哥耶,赶紧给我解决了吧 --------------------编程问答-------------------- 请注意,事务 本身异常,请 在 sql 自己捕获,不是所有的 数据库访问 库 都能捕获数据库异常 。
请 利用 异常处理机制 处理 混滚事务
比如: 前面 写写写
不用 管回滚,只在你认为 错误的地方 抛出 异常即可
eg:
begin
begin 事务
-----你要干的事情(中间也可以 之际抛出异常)
commit 事务
捕获 异常
回滚事务
--不管成功与否 都请返回数据
--不是所有的 中间库都能 数据,最好使用 带输出参数 判断定
end
补充:.NET技术 , C#