C# 访问数据库事务插入限制

C# 访问数据库事务插入限制,c#,transactions,limit,ms-access-2010,C#,Transactions,Limit,Ms Access 2010,在需要提交或Access/Jet抛出错误之前,Access事务中可以执行的插入量是否有限制 我目前正在运行以下代码,希望确定最大值是多少 OleDbConnection cn = new OleDbConnection( @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\temp\myAccessFile.accdb;Persist Security Info=False;

在需要提交或Access/Jet抛出错误之前,Access事务中可以执行的插入量是否有限制

我目前正在运行以下代码,希望确定最大值是多少

OleDbConnection cn =
                new OleDbConnection(
                    @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\temp\myAccessFile.accdb;Persist Security Info=False;");
            try
            {
                cn.Open();
                oleCommand = new OleDbCommand("BEGIN TRANSACTION", cn);               
                oleCommand.ExecuteNonQuery();    
                oleCommand.CommandText =
                            "insert into [table1] (name) values ('1000000000001000000000000010000000000000')";

                for (i = 0; i < 25000000; i++)
                {
                    oleCommand.ExecuteNonQuery();
                }                

                oleCommand.CommandText = "COMMIT";
                oleCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {

            }
            finally
            {
                try
                {

                    oleCommand.CommandText = "COMMIT";
                    oleCommand.ExecuteNonQuery();                    
                }

                catch{}

                if (cn.State != ConnectionState.Closed)
                {
                    cn.Close();
                }
            }
OleDbConnection cn=
新OLEDB连接(
@“Provider=Microsoft.ACE.OLEDB.12.0;数据源=C:\temp\myAccessFile.accdb;持久安全信息=False;”;
尝试
{
cn.Open();
oleCommand=新的OleDbCommand(“开始交易”,cn);
oleCommand.ExecuteOnQuery();
oleCommand.CommandText=
“插入[表1](名称)值('10000000001000000000000000000000000000000')”;
对于(i=0;i<25000000;i++)
{
oleCommand.ExecuteOnQuery();
}                
ocleCommand.CommandText=“提交”;
oleCommand.ExecuteOnQuery();
}
捕获(例外情况除外)
{
}
最后
{
尝试
{
ocleCommand.CommandText=“提交”;
oleCommand.ExecuteOnQuery();
}
捕获{}
if(cn.State!=ConnectionState.Closed)
{
cn.Close();
}
}

在一个未受限制的事务中插入2333920次时,我在生产应用程序上收到的错误是:“超过了文件共享锁计数。增加MaxLocksPerFile注册表项”。禁用事务解决了此问题。

是的,实际上有一个限制。你已经很清楚了。Per:

如果执行事务所需的锁数超过每个文件的最大锁数,则会发生此错误


在这个链接上有两个变通方法。第二个更现实,它暂时更改了最大锁。

我刚刚成功地在.accdb数据库的一个表上创建并提交了一个5000000次插入的事务。一个显著的区别是,我没有直接发出
begintransaction
COMMIT
语句,而是使用了
OleDbTransaction
对象:

cmd.CommandText=
@“插入公司(ID,CompanyName)值(?,)”;
cmd.Parameters.Add(“?”,OleDbType.Integer);
cmd.Parameters.Add(“?”,OleDbType.VarWChar,255);
cmd.Prepare();
OleDbTransaction tran=con.BeginTransaction();
cmd.Transaction=tran;

对于(int i=1;i在这个问题上没有足够的信息。错误是什么?真正的代码在哪里?你是如何连接到Jet的?添加了更多信息。Tnx。感谢文档链接。我将把插入内容分成更小的批次,每笔交易500K个插入内容,这应该能为我们解决问题。@user986363,没问题,我很高兴我能您会有所帮助的!这是一个有趣的区别。看起来事务实际上可能是在本地管理的。@neoistheone显然,
OleDbTransaction
对象正在做一些事情来避开@user986363遇到的限制。我刚刚尝试了10000000个插入事务,它也起了作用。@neoistheone是的,
.Rollback()
确实有效,至少在“小范围”内有效测试100000次插入。好吧,很明显,它是在事务中本地缓冲这些语句,然后在
提交
上执行它们。哇,我的意思是告诉你,我们必须在其中处理的东西真是太疯狂了!@neoistheone它确实让事情变得有趣,这是肯定的。顺便说一句,我用一些更新了我的答案更多细节。