Access 2007 - “无法更新;当前已锁定”
Posted
技术标签:
【中文标题】Access 2007 - “无法更新;当前已锁定”【英文标题】:Access 2007 - "Could not update; currently locked" 【发布时间】:2008-12-17 13:32:57 【问题描述】:首先对不起我的英语不好,但我会尽力而为。
现在我正在编写一个使用 Access 2007 作为数据存储的 .net 应用程序。
简而言之:我有两个线程。一个线程将带有事务的行插入到表中。另一个线程以恒定的时间间隔更新许多行。
线程 1
Database db = _loggingDatabase;
using (DbConnection conn = db.CreateConnection())
conn.Open();
DbTransaction txn = conn.BeginTransaction();
try
string qryInsert = "Insert this";
DbCommand cmdIns = db.GetSqlStringCommand(qryInsert);
db.ExecuteNonQuery(cmdIns, txn);
txn.Commit();
catch (Exception ex)
txn.Rollback();
throw ex;
finally
conn.Close();
线程 2
Database db = _loggingDatabase;
using (DbConnection conn = db.CreateConnection())
conn.Open();
DbTransaction txn = conn.BeginTransaction();
try
string qryUpdate = "Update that";
DbCommand cmdUpdt = db.GetSqlStringCommand(qryUpdate);
db.ExecuteNonQuery(cmdUpdt, txn);
txn.Commit();
catch (Exception ex)
txn.Rollback();
throw ex;
finally
conn.Close();
如果我触发插入许多记录,我会得到一个 System.Data.OleDb.OleDbException,上面写着:“无法更新;当前已锁定”。我试图将连接字符串更改为
connectionString="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=datastore.accdb; Jet OLEDB:Database Locking Mode=1;"
对我的应用程序行为没有影响。我决定使用这些事务来避免混乱的插入和更新。
有解决方法吗? 我究竟做错了什么? 我可以将我的事务插入到某种事务队列到 Access 中吗? 为什么 Access 不自己这样做?
【问题讨论】:
【参考方案1】:Stefan Gruber 问:
我可以将我的交易插入一些 什么样的事务队列进入Access? 为什么 Access 不这样做 本身?
我认为您没有理解 Jet 数据库引擎。首先,澄清一下:MS 可能在其 ODBC 和 OLEDB 连接字符串中使用“MS Access”作为名称,但在这种情况下您根本没有使用 Access —— 只是 Access 的默认数据库引擎 Jet。
Jet 不是服务器数据库引擎。也就是说,在客户端和存储数据的 MDB 文件之间没有服务器进程。 MDB 文件的所有“用户”都通过文件系统访问它。为了管理多用户访问,有一个锁定文件(LDB 文件)来跟踪哪些表/记录被锁定以及哪些类型的锁定。 Jet 检查该 LDB 文件以确定它可以做什么和不能做什么。
现在,由于没有服务器级进程来管理与磁盘数据的所有交互,因此不可能对访问 MDB 文件的请求进行任何编组。你的应用必须自己做。
如果不满意,则说明您使用了错误的数据存储。
【讨论】:
【参考方案2】:在这种情况下使用 MARS(多个活动结果集)。 在网上搜索如何实现 MARS。
【讨论】:
【参考方案3】:不确定这是否会有所帮助,但本文可能有助于解释如何处理“Microsoft Jet 数据库引擎具有读取缓存和延迟写入”这一事实:
How To Implement Multiuser Custom Counters in Jet
【讨论】:
以上是关于Access 2007 - “无法更新;当前已锁定”的主要内容,如果未能解决你的问题,请参考以下文章
要在 Access 2007 中打开的 Access 2013 文件
Access 2007 与 Sharepoint 2007 任务列表的集成
同时运行 Access 2003 和 2007 是不是安全?