c# 回滚 sql存储过程回滚哪个好 c# 回滚 sql存储过程回滚哪个好,现在在网络不太好或其它未知情况下,在SQL存储过程里加的set xact_abort on 回滚没用,一个过程里先插入,后更新,往往出现插入了但是没有更新。所以想问到底是要写在代码里?还是存储过程写的有问题。代码里是FOR 循环 提交的数据。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.最好写在存储过程中,因为代码的本质也是调用sql的事务2.问题在你的for循环中3.如果是循环提交,多次提交,应该合并为一次提交,然后把它放到事务中去4.采用显式事务begin tranrollback trancommit tran仔细寻找问题,估计问题就快解决了 丝毫不需要写。不要画蛇添足。只需要在ado.net调用时使用transaction就行了。就算你发送了命令之后,然后把网线拔掉了,数据库系统也会自动回滚事务的,用不着任何一个代码去些什么rollback指令。 你画蛇添足地写了,反而要跑到csdn问如何诊断哪里有问题,你说这悲剧不悲剧?事务机制本身就会防止以为崩溃的,当commit没有执行完毕之前,与数据库联系的会话崩溃时,事务就会自动回滚的,用不着你写任何rollback代码。 同时,数据库系统的执行异常也会反馈到.net客户端程序,从而让程序根本执行不到commit就自动回滚了。另外当你只有一条sql语句调用,sql server会自动产生一个事务。所以这个时候你甚至在.net客户端代码中根本不用显示地去new一个DBTransaction对象实例,不用调用其Commit代码,也是可以保证事务的(数据库端有bug也不会让事务提交的)。这个sql语句当然也包括调用存储过程。所以不要在你的存储过程中些什么commit、rollback语句。除非你使用存储过程做操作系统长期轮询的任务管理(我想一千个编程人员中难得有两三位去写这样的存储过程)。 路过 学习顺便问下 ADO.net的transaction是什么? 目前在代码里没有写回滚的,按您的说法是 存储过程里也不用写事务了?只有一条sql语句调用,sql server会自动产生一个事务——现在一个过程里有是先插入后更新。现在是反反复复的出现这些问题,所以求救,请大侠不吝赐教。 AS set xact_abort onbegin tran txdeclare @rowcount int--返回执行行数set @rowcount = 0declare @err intset @err = 0……insert into set @err=@err+@@errorbegin ……update ……endIF @err <> 0 rollback tran txelse commit tran tx 事务里面的错误代码有没有写错?INSERT INTOset @err=@err+@@errorUPDATE SETset @err=@err+@@errorIF @err<>0 回滚... 差之厘毫,失之千里IF @@ERROR <> 0 rollback tran txelse commit tran tx 他这样累计错误应该也是没有错的,UPDATE的时候是不是没有积累错误了这样一起回滚的时候,插入和更新要么全部失败要么全部成功 谢谢,UPDATE 的时候累计了的:begin……set @err=@err+@@errorend 主体就是这样:begin trandeclare @err intset @err = 0-------插入insert into……set @err=@err+@@error————更新update set @err=@err+@@error——回滚IF @err <> 0 rollback tran else commit tran 这种解决方案有很多重复的处理,特别是如果你的业务逻辑需要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 请问,ADO.NET中如何使用单字符通配符 同一个类得两个对象间得赋值问题 c# dev treelist nodecell选中 请问各位大侠,c#怎么操作这个功能呢? 最近准备用C#搞GIS,大家有没有这方面的资料给介绍下 写DBF文件的问题!急! 我的坛子,欢迎大家来做客,批评指教 我要用 DataGrid.HitTestInfo,为什么我打DataGrid后为什打点以后不显示HitTestInfo 求助, WinForm怎么发送和接收消息? c#A介面铵键触发,使B介面的铵键被触发,(新人)
2.问题在你的for循环中
3.如果是循环提交,多次提交,应该合并为一次提交,然后把它放到事务中去
4.采用显式事务
begin tranrollback tran
commit tran仔细寻找问题,估计问题就快解决了
顺便问下 ADO.net的transaction是什么?
只有一条sql语句调用,sql server会自动产生一个事务——现在一个过程里有是先插入后更新。现在是反反复复的出现这些问题,所以求救,请大侠不吝赐教。
set xact_abort on
begin tran txdeclare @rowcount int--返回执行行数
set @rowcount = 0declare @err intset @err = 0……
insert into set @err=@err+@@errorbegin
……
update
……
endIF @err <> 0
rollback tran tx
else
commit tran tx
INSERT INTO
set @err=@err+@@error
UPDATE SET
set @err=@err+@@errorIF @err<>0 回滚...
rollback tran tx
else
commit tran tx
这样一起回滚的时候,插入和更新要么全部失败要么全部成功
begin
……
set @err=@err+@@error
end
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
@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