c# 回滚 sql存储过程回滚哪个好

lanqiaoerp 2012-03-24 12:17:41
c# 回滚 sql存储过程回滚哪个好,现在在网络不太好或其它未知情况下,在SQL存储过程里加的set xact_abort on 回滚没用,一个过程里先插入,后更新,往往出现插入了但是没有更新。


所以想问到底是要写在代码里?还是存储过程写的有问题。

代码里是FOR 循环 提交的数据。
...全文
429 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
CNCaiNiao 2012-03-27
  • 打赏
  • 举报
回复
这种解决方案有很多重复的处理,特别是如果你的业务逻辑需要2个以上的T-SQL语句时。比较优雅的解决方案是组合所有的代码,使用一个通用的错误处理。

CREATE PROCEDURE addTitle(@title_id VARCHAR(6), @au_id VARCHAR(11),
@title VARCHAR(20), @title_type CHAR(12))
AS

BEGIN TRAN
INSERT titles(title_id, title, type)
VALUES (@title_id, @title, @title_type)

IF (@@ERROR <> 0) BEGIN
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
RETURN 1
END

INSERT titleauthor(au_id, title_id)
VALUES (@au_id, @title_id)

IF (@@ERROR <> 0) BEGIN
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
RETURN 1
END

COMMIT TRAN

RETURN 0

lanqiaoerp 2012-03-26
  • 打赏
  • 举报
回复
沉了沉了哦,难道结贴?
  • 打赏
  • 举报
回复
你画蛇添足地写了,反而要跑到csdn问如何诊断哪里有问题,你说这悲剧不悲剧?

事务机制本身就会防止以为崩溃的,当commit没有执行完毕之前,与数据库联系的会话崩溃时,事务就会自动回滚的,用不着你写任何rollback代码。
  • 打赏
  • 举报
回复
丝毫不需要写。不要画蛇添足。

只需要在ado.net调用时使用transaction就行了。就算你发送了命令之后,然后把网线拔掉了,数据库系统也会自动回滚事务的,用不着任何一个代码去些什么rollback指令。
传递正能量 2012-03-24
  • 打赏
  • 举报
回复
1.最好写在存储过程中,因为代码的本质也是调用sql的事务
2.问题在你的for循环中
3.如果是循环提交,多次提交,应该合并为一次提交,然后把它放到事务中去
4.采用显式事务
begin tran

rollback tran
commit tran

仔细寻找问题,估计问题就快解决了
  • 打赏
  • 举报
回复
事务为何...真心不懂..
lanqiaoerp 2012-03-24
  • 打赏
  • 举报
回复
主体就是这样:

begin tran
declare @err int
set @err = 0
-------插入
insert into
……
set @err=@err+@@error


————更新
update

set @err=@err+@@error


——回滚
IF @err <> 0
rollback tran
else
commit tran
lanqiaoerp 2012-03-24
  • 打赏
  • 举报
回复
谢谢,UPDATE 的时候累计了的:
begin
……
set @err=@err+@@error
end
缪军 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rczjp 的回复:]
[/Quote]
++
8楼的说的对的,
楼主可以忽略我的回复
rczjp 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 microtry 的回复:]

差之厘毫,失之千里
SQL code

IF @@ERROR <> 0
rollback tran tx
else
commit tran tx
[/Quote]他这样累计错误应该也是没有错的,UPDATE的时候是不是没有积累错误了
这样一起回滚的时候,插入和更新要么全部失败要么全部成功
缪军 2012-03-24
  • 打赏
  • 举报
回复
差之厘毫,失之千里

IF @@ERROR <> 0
rollback tran tx
else
commit tran tx
rczjp 2012-03-24
  • 打赏
  • 举报
回复
事务里面的错误代码有没有写错?
INSERT INTO
set @err=@err+@@error
UPDATE SET
set @err=@err+@@error

IF @err<>0 回滚...
lanqiaoerp 2012-03-24
  • 打赏
  • 举报
回复
AS
set xact_abort on
begin tran tx

declare @rowcount int--返回执行行数
set @rowcount = 0

declare @err int

set @err = 0

……
insert into

set @err=@err+@@error

begin
……
update
……
end

IF @err <> 0
rollback tran tx
else
commit tran tx
lanqiaoerp 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sp1234 的回复:]
同时,数据库系统的执行异常也会反馈到.net客户端程序,从而让程序根本执行不到commit就自动回滚了。

另外当你只有一条sql语句调用,sql server会自动产生一个事务。所以这个时候你甚至在.net客户端代码中根本不用显示地去new一个DBTransaction对象实例,不用调用其Commit代码,也是可以保证事务的(数据库端有bug也不会让事务提交的)。这个sql语句当然也包括调用……
[/Quote]


目前在代码里没有写回滚的,按您的说法是 存储过程里也不用写事务了?
只有一条sql语句调用,sql server会自动产生一个事务——现在一个过程里有是先插入后更新。

现在是反反复复的出现这些问题,所以求救,请大侠不吝赐教。
kiba518 2012-03-24
  • 打赏
  • 举报
回复
路过 学习
顺便问下 ADO.net的transaction是什么?
  • 打赏
  • 举报
回复
同时,数据库系统的执行异常也会反馈到.net客户端程序,从而让程序根本执行不到commit就自动回滚了。

另外当你只有一条sql语句调用,sql server会自动产生一个事务。所以这个时候你甚至在.net客户端代码中根本不用显示地去new一个DBTransaction对象实例,不用调用其Commit代码,也是可以保证事务的(数据库端有bug也不会让事务提交的)。这个sql语句当然也包括调用存储过程。

所以不要在你的存储过程中些什么commit、rollback语句。除非你使用存储过程做操作系统长期轮询的任务管理(我想一千个编程人员中难得有两三位去写这样的存储过程)。

111,126

社区成员

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

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

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