起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 252|回复: 9

请问怎样回滚存储过程。

[复制链接]
发表于 2009-11-30 11:28:27 | 显示全部楼层 |阅读模式
当存储过程执行时间超出相应时间时。x3的界面已经终止了(提示"操作超时")。但是在数据库中该存储过程还在执行。怎样终止它?
回复

使用道具 举报

发表于 2009-11-30 12:01:35 | 显示全部楼层
这个是没有办法终止的,除非去终止数据库的进程,但那样会带来别的问题。
如果确实存储过程执行需要较长时间的话:
  建议楼主换个思路,能否尽量把存储过程按时间片(主要是长短)均分成几个,然后在同一个事务中启动,如果中间需要回滚只要回滚事务就行了!
  如果是存储过程里单个SQL执行很慢那就只能想办法优化那条SQL或数据结构,让它执行快些。
  硬要停止存储过程的方法,只能根据数据库类型去搜索相关的方法和资料了!但估计也只能是手工操作,用程序停下来的可能性不大!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-30 12:05:51 | 显示全部楼层

请问 怎么做,可以给个实例吗?

建议楼主换个思路,能否尽量把存储过程按时间片(主要是长短)均分成几个,然后在同一个事务中启动,如果中间需要回滚只要回滚事务就行了!
运用存储过程的事务必须是立即事务,不然存储过程不会执行。
回复 支持 反对

使用道具 举报

发表于 2009-11-30 13:27:14 | 显示全部楼层
Connection.Transaction.Start(True) 立即事务
Connection.Transaction.Start(False) 非立即事务,
设计过程中要注意:立即事务比较占用数据库连接资源。不易执行过于频繁。
回复 支持 反对

使用道具 举报

发表于 2009-11-30 13:30:05 | 显示全部楼层
至于存储过程怎么分,完全看存储过程的内容,时间片(占用)上怎么分比较均匀完全由数据库的测试结果决定,关于这一点,没有任何实例可以参考比拟的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-30 13:57:42 | 显示全部楼层

请问 存储过程可以用非立即事务吗?

如题.
回复 支持 反对

使用道具 举报

发表于 2009-11-30 15:29:58 | 显示全部楼层
可以的,不知道楼主从哪里看到或者说执行非立即事务出现啥问题了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-30 15:37:33 | 显示全部楼层

运用非立即事务执行存储过程不行!

用非立即事务执行存储过程。存储过程的返回值。永远是0;好像没有执行存储过程一样。为什么?
请看:http://bbs.justep.com/forum.php? ... 3%CC%2A%CA%C2%CE%F1
回复 支持 反对

使用道具 举报

发表于 2009-11-30 18:01:55 | 显示全部楼层
哦,我们确认一下,然后跟贴告知吧
回复 支持 反对

使用道具 举报

发表于 2009-12-1 10:24:49 | 显示全部楼层
非立即事务执行存储过程的返回值确实是0,这个有个原理在里头所以对一个存储过程分片时要注意各个子存储过程之间不能有数据依赖关系的,否则就不能用非立即事务了!这里我简单的说一下非立即事务的实现原理楼主就比较明白了.
    非立即事务,其实就是不在服务端立即执行事务中的任务,这时候需要执行的任务没有发送到数据库去,只是存储在了客户端,当提交的时候服务端才会真正的执行。由于任务启动时并没有真正在数据库中执行(而客户端又无法法模拟这种执行,如果无需模拟的执行就没关系,比方说在数据表中反复修改数据,这些数据由于本来就存储在客户端,所以可以预知结果,存储过程是不行的),所以自然客户端也得不到正确结果。
    相反,立即事务,会在数据库上占用一个session来启动事务,然后把所有任务直接发送到服务端执行,这样客户端就能正确返回结果了。这最后的提交只是数据库级的提交而已!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-13 22:46 , Processed in 0.038035 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表