注册 登录
编程论坛 ASP.NET技术论坛

此 SqlTransaction 已完成;它再也无法使用。

hhy420459674 发布于 2011-01-04 17:31, 6070 次点击
我用了事物, SqlConnection con = datacon.createEMail();
        con.Open();
        SqlCommand cmd = new SqlCommand();
        SqlTransaction trans;
        trans = con.BeginTransaction(IsolationLevel.ReadCommitted);
        cmd.Connection = con;
        cmd.Transaction = trans;
try
{
    //先有个Insert,向数据表中添加数据
    //然后接连有3个循环,也向数据表中循环添加数据
    //完成后,();
}
catch ()
{
    trans.Rollback();
}

但是结果,红色部分却报错说:此SqlTransaction 已完成;它再也无法使用。
我看了下,我的第一个Insert是成功了的,后面的连续三个for循环里面一个都没有成功!

请问下  是怎么回事啊?我百度了下,但是都没有得到解决!
7 回复
#2
wangnannan2011-01-05 08:17
你把catch中的 trans.Rollback();去掉就可以了。 因为前面已经();了,这个表示事物已经结束,  后面再调用当然会出现前面的问题了。  
另外不用指明trans.Rollback(),如果有异常的话,事物会自动回滚的。

#3
hhy4204596742011-01-05 08:45
回复 2楼 wangnannan
谢谢bz哈,照你的方法我已经搞定了,我想问问   是不是只要用了事物,用了try{}catch{}来抛异常的话就不用rollBack()了吗?有错会自动回滚,是这样子的么?
#4
makebest2011-01-05 08:56
直接删除回滚部分也叫搞定? 这样根本是治标不治本的,
按照流程, 执行 Commit 必须是 try 语句中的最后一句,
因此 Rollback 与 Commit 是不会都被执行的, 还是要查具体原因的.
#5
wangnannan2011-01-05 09:12
我的第一个Insert是成功了的,后面的连续三个for循环里面一个都没有成功!
是得看看是什么原因啊 !
#6
hhy4204596742011-01-05 09:26
现在的情况是:如果加上trans.Rollback();则每一个都不会执行成功的,现在去掉了那句,就正确了!
#7
makebest2011-01-05 09:47
使用事务就是用来保证要么全部成功, 要么全部失败.
你不要这样的效果就别用事务了.
#8
hhy4204596742011-01-05 09:51
回复 7楼 makebest
我就是要这样子的效果,现在也已经是那样子的效果了!
1