当前位置:首页 » 存储配置 » 存储过程回滚

存储过程回滚

发布时间: 2024-12-28 16:10:48

‘壹’ 存储过程的问题 回滚

看你程序怎么写的,如果循环中每次插入每次提交自然回滚不了了,一般来说是整个作为一个事务,在发生错误异常处理时候做ROLLBACK。存储过程自己没有回滚功能,要你在程序中控制事务完整性的。如果你不写commit也不写rollback的话,自动作为一个事务整体会失败,事务自动回滚,如果执行成功,事务结束则自动提交。

‘贰’ JDBC调用存储过程,存储过程中事务回滚,报错

ConnCloseThread中关闭连接的时候,不是立刻返回的。Connection.close()会触发Connection.commit(),而因为调用的存储过程中,存储过程起了自己的事务,connection.commit()必须等到存储过程结束才能完成(这个是microsoft论坛上看到的)。如果所有connection.close()都等到tx commit或rollback完成才执行的话,这个问题就不会出现了
从测试结果来看,凡是close connection耗时比execute statement短的,连接(物理连接)都会报出该问题。分析原因:通过weblogic datasource获取的connection并不是物理connection,而是由weblogic wrapped的connection。这些conection在被close后,并不会关闭物理连接,而只是将物理连接还池。我们对connection的所有操作,最终都会被delegated到底层物理连接上,即commit(),rollback()最终都是在物理连接上执行。如果上面的connection.close(),底层物理连接没有等到存储过程事务结束就返回的话,那么物理连接上应该还带有此次操作的事务,而weblogic这边不会关系物理连接的情况,直接将连接放入connection pool供其它客户端使用。这时候如果设定了test on reserve的话,下次客户端从data source获取连接时,weblogic会检查这个物理连接,作一个select操作的,这个有问题的连接就会暴露出来,也就是上面的异常。这个问题如果使用driver manager来获取连接的话(如果每次都关闭的话),则不会出现,因为使用的物理连接每次都是不同的。还好,weblogic会帮忙重新创建有问题的连接。原因大概了解了,但这是谁的问题呢? 为什么connection.close()不等存储过程的事务结束?

结论:一般而言,我们不建议通过JDBC调用存储过程的时候,在存储过程中定义事务,应该将tx的管理工作交给jdbc去做。 non-xa如此,xa亦如此,毕竟事务嵌套了以后,管理起来是个问题,完整性更是个问题。

‘叁’ 存储过程回滚 急

BEGIN TRY

END
BEGIN CATCH
END CATCH
用这个试试呢

‘肆’ 为什么存储过程总返回

你是用ExecuteNonQuery进行“添加”操作的把?

ExecuteNonQuery 不返回任何行数据,但映射到参数的任何输出参数或返回值都会用数据进行填充。
对于查询更新删除操作UPDATE、INSERT 和DELETE 语句,返回值为该命令所影响的行数。
对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也为-1

如果执行了存储过程,返回值必定是-1 , 因此不能根据返回值来判断其是否执行成功。

‘伍’ sql中的存储过程里怎么写事务回滚啊

CREATE PROC [dbo].[notice_Delete] --- 同时删除该通知书和对应的节点
@tbl VARCHAR(30),
@pid INT
AS
BEGIN
DECLARE @tblname VARCHAR(30) ;
DECLARE @sql VARCHAR(1000) ;
SET @tblname = @tbl
SET @sql = 'delete ' + @tblname + ' where id ='
+ CONVERT(VARCHAR(10), @pid)

BEGIN TRAN --开始事务

EXEC ( @sql
)
IF ( @@rowcount = 0 ) --执行结果影响行数为0
BEGIN
ROLLBACK TRAN --回滚
END
ELSE
BEGIN
DELETE FROM tbl_treenotice
WHERE purposeid = @pid
IF ( @@rowcount = 0 ) --执行结果影响行数为0
BEGIN
ROLLBACK TRAN --回滚
END
ELSE
BEGIN
COMMIT TRAN --提交事务
END
END
END

‘陆’ sql存储过程中事务出现错误回滚,那么在回滚之后的语句会执行吗

会的。

一般回滚操作都是写在异常处理,或是sql的最后。如果你的sql中出现错误 ,代码会立即跳转到错误处理代码上执行,比如回滚,但紧接在错误行之后的代码不会执行的。


1.update .....;

2.select ......;
3.when Exception
....rollback;
4.insert into .....

以上伪代码,如果行1出错,行2将不会执行,直接跳转到行3,然后行4 也会执行。

‘柒’ mysql 存储过程 异常 是否自动 回滚

是滴,默认是隐式的开始与提交,出现异常会默认自动回滚到开始位置,任何一个使用JDBC操作数据库的SQL命令,在默认情况下,隐式开始与提交事务。当显示的调用事物时,就必须显示使用commit当使用rollback后也要进行commit;

热点内容
电影电视分镜头脚本 发布:2024-12-29 06:48:30 浏览:479
老式安卓机关机键坏了怎么办 发布:2024-12-29 06:47:51 浏览:148
压缩预算后 发布:2024-12-29 06:42:04 浏览:738
y55怎么转在存储卡上 发布:2024-12-29 06:41:57 浏览:427
c指针编程 发布:2024-12-29 06:34:35 浏览:388
linux服务器加ip命令 发布:2024-12-29 06:34:33 浏览:799
c语言中的case 发布:2024-12-29 06:23:32 浏览:398
我的世界服务器申请专属ip 发布:2024-12-29 06:21:14 浏览:920
扫雷c语言代码 发布:2024-12-29 06:10:51 浏览:140
python判断对象属性 发布:2024-12-29 06:10:09 浏览:414