C#中调用存储过程,执行出错会不会回滚?

flyskylf 2006-11-27 03:51:24
我记得我以前做的程序,调用SQLServer中的存储过程,如果执行过程中出现错误就会回滚,最近又做了一个程序,执行出了错误又不回滚,我现在也不明白默认的存储过程到底会不会回滚?请高手给个答案.
...全文
466 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream6000 2006-12-03
  • 打赏
  • 举报
回复
To : sxmsy888(网际浪子)

 在SQLServer 2000下,之前我也认为会回滚,测试后发现并不回滚!
 SqlServer 2005下没有测试过
flyskylf 2006-11-29
  • 打赏
  • 举报
回复
我用的是2000,前一段时间(半年了)会回滚的,但是最近写的程序又不回滚了,不知道是不是我记错了
CodeWalker2999 2006-11-29
  • 打赏
  • 举报
回复
Dream6000
我用SqlServer 2005测试了一下,确实是回滚了啊,两条记录都没写入。
marvelstack 2006-11-29
  • 打赏
  • 举报
回复
需要使用SqlTransaction类启动事务,或在存储过程中实现Sql 事务语句。
http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
Dream6000 2006-11-28
  • 打赏
  • 举报
回复
之前说错了 存储过程是不会被回滚的

create table t2
(
tID int identity(1,1),
tAction nvarchar(30) not null
)
go

create proc p2
as
insert into t2 (tAction) values ('xxx')
insert into t2 (tAction) values (null)


exec p2


虽然出错但 xxx 可以被写入
CodeWalker2999 2006-11-28
  • 打赏
  • 举报
回复
同意Dream6000
不加BEGIN TRANSACTION COMMIT TRANSACTION也会回滚
Dream6000 2006-11-28
  • 打赏
  • 举报
回复
存储过程中的sql命令属于事务处理范畴,即存储过程中的所有sql语句要么都执行,要么都不执行,即"原子性".

你可以写一个存储过程来试试:
create database test
use test
create datatable t1
(
tID int identity(1,1),
tAction nvarchar(30)
)
go

create proc p1
as
insert into t1 (tAction) values ('xxx')
insert into t1 (tAction) values (bbb)


因为 bbb 没有加引号 所以会出错 ,之前成功执行的 'xxx'也被回滚了
zw_angel 2006-11-27
  • 打赏
  • 举报
回复
必须加BEGIN TRANSACTION COMMIT TRANSACTION才能回滚
xyh2002 2006-11-27
  • 打赏
  • 举报
回复
sql中是要这样写的,c#代码会简单些,但是c#代码并不一定会回滚,如果你的数据库连接断了,那么就谈不上执行失败和回滚了。
flyskylf 2006-11-27
  • 打赏
  • 举报
回复
我的另外一个帖子:大家也看看吧,完了一起结掉
http://community.csdn.net/Expert/topic/5188/5188497.xml?temp=.7404901

一个存储过程要执行多条SQL语句,如果程序执行出错为了能够回滚是不是要如下写法?
BEGIN TRANSACTION
EXEC SQL语句1
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLER

EXEC SQL语句2
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLER

EXEC SQL语句3
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLER

.....
EXEC SQL语句N
SET @Error = @@ERROR
IF @Error != 0 GOTO ERROR_HANDLER
COMMIT TRANSACTION

ERROR_HANDLER:
IF @@TRANCOUNT != 0 ROLLBACK TRANSACTION
RETURN @Error

有没有简单的写法不要写那么多的 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLER
lengxiaowei 2006-11-27
  • 打赏
  • 举报
回复
当然不会啦

一定要启动了事务,它才会回滚
mobydick 2006-11-27
  • 打赏
  • 举报
回复
在代码中使用分布式事务TransactionScope,这个需要数据库支持,并打开相应的服务。
liujia_0421 2006-11-27
  • 打赏
  • 举报
回复
不会...

除非加上事务...
flyskylf 2006-11-27
  • 打赏
  • 举报
回复
必须写BEGIN TRANSACTION COMMIT TRANSACTION等代码才能回滚?
flyskylf 2006-11-27
  • 打赏
  • 举报
回复
也就是说存储过程默认是不会回滚的?
mpss 2006-11-27
  • 打赏
  • 举报
回复
程序没写事条,过程中也没写的话,那就不会
flyskylf 2006-11-27
  • 打赏
  • 举报
回复
我是在存储过程中用的事务
51Crack 2006-11-27
  • 打赏
  • 举报
回复
可以在程序中用事务,也可以在存储过程用事务!
不可同时使用!
flyskylf 2006-11-27
  • 打赏
  • 举报
回复
我里面没有写那些BEGIN TRANSACTION COMMIT TRANSACTION等代码,会不会回滚?
  • 打赏
  • 举报
回复
存储过程支持事务

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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