求助:事务提交两次后报错
数据库是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));
}
}