死锁

txws1119 2013-11-01 03:43:35
语句【存储过程】


CREATE PROCEDURE report_proc
@re int OUTPUT --检查报工是否成功 0:成功 大于0:失败
,@tBz varchar(50) --工作时间
,@tNums decimal(9,3) --计时工时
,@costFlag int --计时还是计件. 0:计件 1: 计时
,@firstIN int --报工时检查领料记录,如果没有首工序就生成一条. 0:不需要 1: 需要
,@ifOut bit --报工时合格数转出 0:否 1:是
,@ifNext bit --报工时合格数转到下到工序 0:否 1:是
,@waterid varchar(50) --任务单流水号
,@oppid int --报工唯一号
,@personid varchar(50)
,@personName varchar(50)
,@paydate datetime
,@dodate datetime
,@procid int
,@procCode varchar(50)
,@procName varchar(50)
,@cost decimal(9,3)
,@fcost decimal(9,3)
,@workCenter varchar(50)
,@workMachine varchar(50)
,@operater varchar(50)
,@good_Nums decimal(9,3)
,@lf_badNums decimal(9,3)
,@gf_badNums decimal(9,3)
,@fg_badNums decimal(9,3)
,@hy_badNums decimal(9,3)
,@lost_badNums decimal(9,3)
,@checkMan varchar(50)
,@checkIntro varchar(500)
,@manager varchar(50)
,@nodeid int
,@cataname varchar(50)
,@procType int
,@procTypeName varchar(50)
,@cValue decimal(9,3)
,@bf_reasonCode varchar(50)
,@fg_reasonCode varchar(50)
,@ifGroup int
,@flag int --返工报工


AS
declare

@firstOppid int -- 任务单首道工序报工唯一号 (即任务单中的工序系统自动编号)
,@firstProcid int -- 任务单首道工序号
,@firstTlNums decimal(9,3) --任务单实际投料数
,@firstInCounts int
,@reportId int --报工自动编号
,@orderV int
,@nextOppid int -- 下到工序报工报工唯一号
,@nextProcid int
,@tCost decimal(9,3) --人员定额


select top 1 @firstOppid=id,@firstProcid=procId from p_ordersProcess where waterid=@waterid order by orderV
select @firstTlNums=sjtlNums from p_orders where waterid=@waterid
select @firstInCounts=count(id) from p_procWarehouseInOut where oppid=@firstOppid and flag=1


--
--if(@firstIN=1 and @firstInCounts=0) -- 首道工序领料
--begin
--insert into p_procWarehouseInOut(oppid,procid,flag,Nums,ifAuto,reportid,manager,tjdate) values(@firstOppid,@firstProcid,1,@firstTlNums,1,0,@manager,@paydate)
--if(@@error<>0)
--begin
--select @re=1
--rollback tran
--return
--end
--end

-------------------------------------

--begin tran /**********开始事务***********/
select @tCost=0

if(@costFlag=0)
begin
insert into p_personActDo(tBz,costFlag,tCost,flag,personid,ifOut,ifNext,personName,oppid,paydate,dodate,procid,procCode,procName,cost,fcost,workCenter,workMachine,
operater,good_Nums,lf_badNums,gf_badNums,fg_badNums,hy_badNums,lost_badNums,checkMan,checkIntro ,manager,nodeid,cataname,procType,procTypeName,cValue,bf_reasonCode,fg_reasonCode,ifGroup)
values(@tBz,@costFlag,@tCost,@flag,@personid,@ifOut,@ifNext,@personName,@oppid,@paydate,@dodate,@procid,@procCode,@procName,@cost,@fcost,@workCenter,@workMachine,@operater,@good_Nums,
@lf_badNums,@gf_badNums,@fg_badNums,@hy_badNums,@lost_badNums,@checkMan,@checkIntro,@manager,@nodeid,@cataname,
@procType,@procTypeName,@cValue,@bf_reasonCode,@fg_reasonCode,@ifGroup)
end
else
begin

select @tCost=tCost from jj_persons where id=@personid -- 定额
select @cost=0 -- 计件定额
select @fcost=0
insert into p_personActDo(tBz,tNums,costFlag,tCost,flag,personid,ifOut,ifNext,personName,oppid,paydate,dodate,procid,procCode,procName,cost,fcost,workCenter,workMachine,
operater,good_Nums,lf_badNums,gf_badNums,fg_badNums,hy_badNums,lost_badNums,checkMan,checkIntro ,manager,nodeid,cataname,procType,procTypeName,cValue,bf_reasonCode,fg_reasonCode,ifGroup)
values(@tBz,@tNums,@costFlag,@tCost,@flag,@personid,@ifOut,@ifNext,@personName,@oppid,@paydate,@dodate,@procid,@procCode,@procName,@cost,@fcost,@workCenter,@workMachine,@operater,@good_Nums,
@lf_badNums,@gf_badNums,@fg_badNums,@hy_badNums,@lost_badNums,@checkMan,@checkIntro,@manager,@nodeid,@cataname,
@procType,@procTypeName,@cValue,@bf_reasonCode,@fg_reasonCode,@ifGroup)
end
if(@@error<>0)
begin
select @re=2
-- rollback tran
return
end

SELECT @reportId = SCOPE_IDENTITY()
------------------------------------------------------
if(@ifOut=1 and @good_Nums>0) --报工后合格品转出
begin
insert into p_procWarehouseInOut(oppid,procid,flag,Nums,ifAuto,reportid,manager,tjdate) values(@oppid,@procid,-1,@good_Nums,1,@reportId,@manager,@paydate)
if(@@error<>0)
begin
select @re=3
-- rollback tran
return
end
end
----------------------------------------------
if(@ifNext=1 and @good_Nums>0) -- 下道工序自动转入
begin
select @orderV=orderV from p_ordersProcess where id=@oppid
set @nextOppid=0
set @nextProcid=0
select top 1 @nextOppid=id,@nextProcid=procid from p_ordersProcess where waterid=@waterid and orderV>@orderV order by OrderV
if(@nextOppid>0)
begin
insert into p_procWarehouseInOut(oppid,procid,flag,Nums,ifAuto,reportid,manager,tjdate) values(@nextOppid,@nextProcid,1,@good_Nums,1,@reportid,@manager,@paydate)
if(@@error<>0)
begin
select @re=4
--rollback tran
return
end
end
end
---------------------------------------------------------班组报工,比例记录
if(@ifGroup=1)
begin
delete p_groupActDo where reportId=@reportId
if(@@error<>0)
begin
select @re=5
-- rollback tran
return
end

insert into p_groupActDo(reportId,groupId,personId,personName,percentValue) (select @reportId as reportId,@personid as groupId,personId,personName,percentValue from s_groupsPersons where groupId=@personid)
if(@@error<>0)
begin
select @re=6
--- rollback tran
return
end

end


---commit tran


GO
...全文
275 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Q315054403 2013-11-02
  • 打赏
  • 举报
回复
单纯看一个SP无数据库结构及数据分布特点等,没法作准确分析,除非是明显的SQL改写 若有预算,外包出来优化
中国风 2013-11-02
  • 打赏
  • 举报
回复
SQL2000,建适合的索引,尝试表分拆,优化缩短事务执行时间. 可参照SQL2005以后的版本处理方法:分析死锁并处理_整理贴5 http://bbs.csdn.net/topics/250022124
LongRui888 2013-11-01
  • 打赏
  • 举报
回复
要是sql server 2005及以后,可以通过sql profiler 来跟踪Lock中的 deadlock graph 。 死锁发生时,就会跟踪到具体的死锁信息,而且易于理解
LongRui888 2013-11-01
  • 打赏
  • 举报
回复
另外, 可以通过跟踪标记,来跟踪死锁的信息: --开启死锁跟踪 USE MASTER DBCC TRACEON (1204,-1) --取消跟踪1204: DBCC TRACEOFF (1204,-1) 在设定跟踪1204后,会在数据库的日志文件errorlog里显示SQL Server数据库死锁时一些信息。 但那些信息很难看懂,需要对照SQL Server联机丛书仔细来看。
LongRui888 2013-11-01
  • 打赏
  • 举报
回复
你现在只了解死锁的一方,进程id为358的,但是另一个进程你不知道,所以得加强监控,知道发生死锁的两个会话的情况,这样才能知道为什么会有死锁,然后再能进行下一步处理。 找了一篇文章,你用里面的语句,监控一下: http://www.cnblogs.com/Terrylee/archive/2005/12/24/303856.html
txws1119 2013-11-01
  • 打赏
  • 举报
回复
sql版本为2000.如何优化?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧