首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

事务提交两次后报错

2013-07-04 
求助:事务提交两次后报错数据库是Oracle,数据量较大,就先做了一个demo测试。数据给十万条,打算每一千条提交

求助:事务提交两次后报错
数据库是Oracle,数据量较大,就先做了一个demo测试。
数据给十万条,打算每一千条提交一次。设置断点在txn.Commit();
能够Commit两次后(能够插入两次结果就是2000个条记录)就报错:System.InvalidOperationException: 对象的当前状态使该操作无效。

希望大家给帮帮忙,程序是winfrom的。在线等好心人解答,代码很简单如下:

   在 Oracle.DataAccess.Client.OracleTransaction.Commit()

public void InsertValueTest()
        {
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            //启用事务
            OracleTransaction txn = conn.BeginTransaction(IsolationLevel.ReadCommitted);
            cmd.Transaction = txn;

            try
            {
                for (int i = 1; i < 100001; i++)
                {
                    cmd.CommandText = @"insert into /*+apppend*/t_channel_value_l0 values (" + i + "," + (i+1) + "," + (i+2) + ")";
                    cmd.CommandType = CommandType.Text;
                    cmd.ExecuteNonQuery();
                    if (i % 1000 == 0)
                    {
                        try
                        {
                            txn.Commit(); //---------这里设置断点,第二次走过以后直接进catch
                        }


                        catch (Exception ex)
                        {
                            ex.ToString();//--------这里报错
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                txn.Rollback();
            }
            finally
            {
                txn.Dispose();
                cmd.Dispose();
            }
        }
[解决办法]
开通另一个线程去做这件事情看看。
[解决办法]
试试
每次批量提交都视为一个事物,而不是在一个事物中循环处理


[解决办法]
例子

string conn_str = @"Data Source=MYX-PC\SQLEXPRESS;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=123456";
                SqlConnection conn = new SqlConnection(conn_str);



                StringBuilder sb = new StringBuilder();
                int count = 5000;
                for (int i = 0; i < count; i++)
                {

                    if ((i % 1000 == 0 && i != 0) 
[解决办法]
 i == count - 1)
                    {
                        try
                        {
                            if (conn.State == ConnectionState.Closed 
[解决办法]
 conn.State == ConnectionState.Broken)
                                conn.Open();
                            using (SqlTransaction tran = conn.BeginTransaction())
                            {

                                using (SqlCommand com = new SqlCommand())
                                {
                                    com.CommandText = sb.ToString();


                                    com.Connection = conn;
                                    com.Transaction = tran;
                                    com.ExecuteNonQuery();
                                    tran.Commit();
                                }
                                sb.Clear();
                            }
                        }
                        catch (Exception ex)
                        {

                        }
                        finally
                        {
                            conn.Close();

                        }
                    }
                    else


                    {
                        sb.Append(string.Format(" insert into Table_1(i,j) values({0},{1})", i, i + 1));
                    }
                }


[解决办法]
你可以每插入100提交一次事物,这样不会出现超时

热点排行