日期:2014-05-16 浏览次数:20562 次
OleDbCommand并发时报’对象已锁定'
int i; 
string strConn,sqlStr,s; 
OleDbConnection cn; 
OleDbCommand cmd; 
private void Button1_Click(object sender, System.EventArgs e) 
{ 
sqlStr=""; 
strConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("ncv.mdb"); 
cn=new OleDbConnection(strConn); 
cn.Open(); 
cmd=new OleDbCommand(sqlStr,cn); 
for(i=1;i<3001;i++) 
{ 
s=i.ToString()+i.ToString()+i.ToString()+i.ToString()+i.ToString(); 
sqlStr="insert into table1(a,b,c,d,e) values('"+s+"','"+s+"','"+s+"','"+s+"','"+s+"')"; 
cmd.CommandText=sqlStr; 
cmd.ExecuteNonQuery(); 
} 
cmd.Dispose(); 
cn.Close(); 
cn.Dispose(); 
}
------解决方法--------------------
你不会使用 
try 
catch吗 
并发控制的类型 
通常,管理数据库中的并发有三种常见的方法: 
保守式并发控制 - 在从获取记录直到记录在数据库中更新的这段时间内,该行对用户不可用。 
开放式并发控制 - 只有当实际更新数据时,该行才对其他用户不可用。更新将在数据库中检查该行并确定是否进行了任何更改。如果试图更新已更改的记录,则将导致并发冲突。 
最后的更新生效 - 只有当实际更新数据时,该行才对其他用户不可用。但是,不会将更新与初始记录进行比较;而只是写出记录,这可能就改写了自上次刷新记录后其他用户所进行的更改。 
保守式并发 
保守式并发通常用于两个目的。第一,在某些情况下,存在对相同记录的大量争用。在数据上放置锁所费的成本小于发生并发冲突时回滚更改所费的成本。 
在事务过程中不宜更改记录的情况下,保守式并发也非常有用。库存应用程序便是一个很好的示例。假定有一个公司代表正在为一名潜在的客户检查库存。您通常要锁定记录,直到生成订单为止,这通常会将该项标记为'已订购'状态并将其从可用库存中移除。如果未生成订单,则将释放该锁,以便其他检查库存的用户得到准确的可用库存计数。 
但是,在断开的结构中无法进行保守式并发控制。连接打开的时间只够读取数据或更新数据,因此不能长时间地保持锁。此外,长时间保留锁的应用程序将无法进行伸缩。 
注意 如果基础数据源支持事务,则可以通过在事务中更新数据来模拟保守式并发。有关更多信息,请参见 ADO.NET 中的事务。