最近用access库做了个网站 发现如果同时千人在线的话 读取数据库会有时候同时读取到同一记录,看到了Application.Lock 
但是有人说 Application.Lock()只对 Application变量有效,想请问下 数据操作代码写在Application.Lock()后是否有效。是否 有什么其它好的方法防止同时读取一条数据记录

解决方案 »

  1.   

    如果你将读取某张表的记录 的代码放在application.lock()内的话那么同时只能有一人进行读取操作其他人必须等到此人unlock后才能读取所有访问网站的人享用同一个application
      

  2.   

    同一时间只能有一人执行lock和unlock之间的程序
      

  3.   

    你看如下代码:
    /* global.asax */
        
    void Application_Start(object sender, EventArgs e) 
    {
      //在应用程序启动时运行的代码
      Application["empNo"] = 0;
    }
    void Application_End(object sender, EventArgs e)
    {
      //在应用程序结束时运行代码
      Application["empNo"] = null;
    }/* EmpNameData.aspx.cx */protected void Page_Load(object sender, EventArgs e)
    {
      
       string queryString = "insert into emp values(1, @empNo, 'empName')";
       SqlConnection conn =new SqlConnection( ConfigurationMananger.ConnectionStrings["DataBaseConnectionStringNameInConfigure"].ToString() );
       
       SqlCommand cmd = new SqlCommand(queryString, conn);
      if(! IsPostBack)
      {
        Application.lock();
        Application["empNo"] = (int)Application["empNo"];
        Application["empNo"] += 1;
        cmd.Parameters.Add(new SqlParameter("@empNo", SqlDbType.VarChar, 20)).Value = Application["empNo"];
        int num = cmd.ExecuteNonQuery();
        if(num>0)
        {
          Response.Write("成功");
          Application.unlock();
        }
        else
        {
          Response.Write("失败");
          Application["empNo"] -= 1;
          Application.unlock();
        }
      }
    }请楼主自己看一看吧,应该会对你有所提示
      

  4.   

    哦,忘了你是Access库,那就把Sql…… 的改为OleDb…… 吧
      

  5.   

    防止同时读一记录是有原因的,比如你是点卡网站 很多用户买点卡 你把这张卡读了 还没标记成已销售这个时候如果被另一用户也读了这张就会造成重复,access好像没锁吧
      

  6.   

    access不能用锁吗?设定conn的隔离级别,就可以设置各种锁                transaction = connection.BeginTransaction(你需要的隔离级别);
                    command.Connection = connection;
                    command.Transaction = transaction;至于你说的点卡,是读了后就暴露了点卡的密码?
    那你为什么不采取"只有已购买此点卡的用户"才能"读"呢?