关于过程中的事务控制(路过的也来拿分撒)
在一个存储过程中,存在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来实现。
[解决办法]
接分~~~~~~
[解决办法]
我路过。
[解决办法]
路过
[解决办法]
上百萬行的事務,請問樓主的實際應用是乾嘛喲,分享一下呀
[解决办法]
路过。
[解决办法]
每个语句都写成事务
那还不如什么事务都不加,这个没什么意义
要加事务肯定是一起加,要就一起成功,要就一起失败
[解决办法]
数据量
[解决办法]
这个还是让大版主来解决吧。
[解决办法]
分部分多个事务首先是数据一致性的考虑,而不是首先考虑死锁不死锁
另外 你所说的自己阻塞自己?!!! 我一直想不明白 如果真是如此 那你的脚本逻辑本身就有问题
[解决办法]
貌似没有问题
[解决办法]
最好是在一个更新完成后再commit,否则太多的事务会影响sql的效率。
[解决办法]
关键看你的程序对数据的一致性要求,如果每句做成一个阻塞可能会小;
[解决办法]
up
[解决办法]
路过的.学习一下...
[解决办法]
用一个事务作控制,到最后再一次提交,如途中发现任何处理错误问题,则rollback
这样可保持数据单据的一致性
[解决办法]
我是不是应该在每个语句都写成事务,每句话后面都写上commit?
---------------
不用,每句话都是一个自动提交的事务.
[解决办法]
帮你顶上去
[解决办法]
JF
[解决办法]
看数据量....不是每句都commit
[解决办法]
路过
[解决办法]
路过
[解决办法]
也想学习一下,帮顶
[解决办法]
飘过
[解决办法]
jf路过
[解决办法]
jf路过
[解决办法]
jf路过
[解决办法]
顶
[解决办法]
jf
[解决办法]
道行不深只有学习和接分
[解决办法]
JF
[解决办法]
曾做过这种项目,一个事务即可,尽量用临时表拆分复杂的语句。
[解决办法]
你可以设多个变量就可以呀
E.g
当你想commit时就给@var1=1 , @var2=1 ,@var3=1
最后就用and判断再一次提交就行了
[解决办法]
如果是从一个表更新到另一个表,可选建一临时表,将要更新的数据放至此表,此过程可不用事务,中间出错就算,反正是临时表,最后数据处理完,再用此临时表更新另一个表,此时再用事务。
[解决办法]
要解决问题,最好将问题再介绍详细,将表结构与你的代码帖出来
[解决办法]
能拿分吗,那我赶紧路过啊
[解决办法]
路过拿分
[解决办法]
dd
[解决办法]
好久以前的帖子了
[解决办法]
mark~
------解决方案--------------------
路过拿分
[解决办法]
路过.
[解决办法]
拿分
[解决办法]
学习一下,啥都没学到