日期:2014-05-19  浏览次数:20490 次

关于过程中的事务控制(路过的也来拿分撒)
在一个存储过程中,存在select   into,insert   into   ,update,delete等语句,而且同时处理的数据量非常大,我是不是应该在每个语句都写成事务,每句话后面都写上commit?
目前的情况是这个过程经常自己阻塞自己,而且后台看到这个过程的进程一直处于sleeping状态,完成时间非常长。而且这个过程执行时,可以在当前活动周看到多个相同spid的进程,相互阻塞,状态都是sleeping。

有什么好的办法么?


------解决方案--------------------
事务越简短越好,否则会造成阻塞,从这个上面看,每句都加事务应该是好的.
------解决方案--------------------
路过
------解决方案--------------------
放到一个事务中就可以了啊 最后commit 这个事务就可以了
------解决方案--------------------
我是路過的
------解决方案--------------------
我來拿分
------解决方案--------------------
select 的时候加个 nolock
------解决方案--------------------
路过!
------解决方案--------------------
另外,举个例子:还要看SELECT INTO 和后面的比如UPDATE的关联,如果SELECT INTO成功,但UPDATE失败,则要看全部回滚还是只回滚失败,如果全部回滚,那就不能每个句写一个事务
------解决方案--------------------
一條一條來嘛
------解决方案--------------------
我觉得在执行过程中,一旦失败,就ROLLBACK,其实逻辑只要顺好,一个事务就可以了.
------解决方案--------------------
嘿嘿,來接分,幫頂下
------解决方案--------------------
学习学习
------解决方案--------------------
可能是你的过程交叉更新或操作同一张或多张表吧.要不就是你的写的语句有问题.比如更新时用子查询.而子查询又产生多个值等
------解决方案--------------------
这类事务,应该看这个存储过程执行情况。
如果是作业类型的,那么将存储过程做拆分,不要写在一起。然后分段执行。
如果是统一执行,那么就写在一个事务里就可以(当然可能产生锁)
------解决方案--------------------
把这些操作都最好包裹到一个事务中进行处理,用一个错误判断号来取得每次执行操作是否正确,当全都正常执行就提交,否则回滚。

declare @intErr int
begin tran
if(@intErr = 0)
begin
select * into #tmp1 from table1
set @intErr = @@error
end

if(@intErr = 0)
begin
update #tmp1 set column1 = 'IRAQ! IRAQ! ' where column1 = 'USA '
set @intErr = @@error
end

if(@intErr = 0)
begin
commit tran
end
else
begin
rollback tran
end

------解决方案--------------------
另外如果一个连接A产生的临时表,#tmp1可能无法对于另一个连接B可见,可以考虑用全局变量
###tmp1来实现。
------解决方案--------------------
接分~~~~~~
------解决方案--------------------
我路过。
------解决方案--------------------
路过
------解决方案--------------------
上百萬行的事務,請問樓主的實際應用是乾嘛喲,分享一下呀
------解决方案--------------------
路过。
------解决方案--------------------
每个语句都写成事务
那还不如什么事务都不加,这个没什么意义

要加事务肯定是一起加,要就一起成功,要就一起失败
------解决方案--------------------
数据量

------解决方案--------------------
这个还是让大版主来解决吧。