mycom = mycon.CreateCommand
        MyTrans = mycon.BeginTransaction(IsolationLevel.ReadCommitted)
        mycom.Connection = mycon
        mycom.Transaction = MyTrans
        Try
            mycom.CommandText = Str1
            mycom.ExecuteNonQuery()
            MyTrans.Commit()
            mycon.Close()
            mycon = Nothing
            bol_sql = True
        Catch ex As Exception
            mycon.Close()
            mycon = Nothing
            bol_sql = False
            MyTrans.Rollback()
            MessageBox.Show(ex.Message, StrName, MessageBoxButtons.OK, MessageBoxIcon.Error)
           End Try 这是我用来提交的一个事务处理。。现在有时候有两个情况出现,
 一,报错提示事务有时候提交失败,提示说事务 以关闭 ??
 二,mycom.CommandText = Str1 这str1中有 insert 和update 语句,为什么有时就其中的一部分语句提交成功?
     在数据库中只能看到Str1中提交的一部分数据?

解决方案 »

  1.   

    我不是很喜欢把很多个SQL写到一起来执行,如果是那样的话还不如用存储过程,
    如果这里用事务,我觉得你可以一个一个的执行SQL,这样比较好一点,然后事务一起提交就行了,但是执行还是最好分开执行
    还有你有时候提交不成功,有时候能提交成功,我觉得可能是因为你一起执行了几句SQL,这样的话每句SQL执行之后,数据对其他的可能也有一些影响,从而造成了后面的SQL执行不成功,你最好具体看看报的具体是什么异常,看看异常信息里面说的是什么.
      

  2.   


    一,报错提示事务有时候提交失败,提示说事务 以关闭 ?? 你在catch语句块中,rollback之前把connection关了。Connection.Close()方法就会 RollBack 挂起的事务。
    后面你再调用RollBack,当然就提示 事务已经关闭。
    Catch ex As Exception 
                mycon.Close() 
                mycon = Nothing 
                bol_sql = False 
                MyTrans.Rollback() 
    二,mycom.CommandText = Str1 这str1中有 insert 和update 语句,为什么有时就其中的一部分语句提交成功? 
        在数据库中只能看到Str1中提交的一部分数据? 你的CommandText里有多条语句,可以这样分开写:
    command.CommandText =
                    "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
                command.ExecuteNonQuery();
                command.CommandText =
                    "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
                command.ExecuteNonQuery();
                MyTrans.Commit() 
      

  3.   

    建议搂主按照下面方式实现事务执行,代码条理很清楚,也便于维护:SqlCommand cmd = new SqlCommand();
    cmd.Connection = new SqlConnection("连接字符串");
    cmd.Connection.Open();
    cmd.Transaction = cmd.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    try
    {
        cmd.CommandText = "SQL语句1";
        int result = cmd.ExecuteNonQuery();
        if (result <= 0)
        {
            cmd.Transaction.Rollback();
            return;
        }    cmd.CommandText = "SQL语句2";
        result = cmd.ExecuteNonQuery();
        if (result <= 0)
        {
            cmd.Transaction.Rollback();
            return;
        }    cmd.CommandText = "SQL语句3";
        result = cmd.ExecuteNonQuery();
        if (result <= 0)
        {
            cmd.Transaction.Rollback();
            return;
        }    //提交事务
        cmd.Transaction.Commit();
    }
    catch
    {
        cmd.Transaction.Rollback();
    }
    finally
    {
        cmd.Connection.Close();
        cmd.Connection.Dispose();
        cmd.Dispose();
    }
      

  4.   

      谢谢楼上各位的指点!!!!
     问题一 解决
     
     问题二 还没觉得 ,问题是我的mycom.CommandText = Str1 这str1中有 insert 和update 语句,  
          
         我的str1中的sql语句的长度是不确定的哦.. 请问怎么处理。。 
      谢谢!!!!   
      

  5.   

    SET TRANSACTION ISOLATION LEVEL
        { READ COMMITTED
            | READ UNCOMMITTED
            | REPEATABLE READ
            | SERIALIZABLE 
        }参数
    READ COMMITTED指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。READ UNCOMMITTED执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
      

  6.   

     我的sql 语句应该没什么问题; 再问用存储过程怎么来处理哦~~~~~~~~~~~~