拜托了,下面的问题好长时间了,我都不敢见人了!很急、很急!我刚做了一个系统,在本机初步测了一下没有问题,
但是很多人同时使用时,出现了下面几个问题。应该是并发产生的问题吧!
使用的人反映问题出现在增加和修改(大部分是正常的!!!):1、刚刚增加的记录找不到,过一会又找到了。
2、修改会造成两个问题:a、丢失刚刚修改的记录;b、多出一条重复记录我的表:id为主键,且自动增加1
单机操作没有问题,两台机器就会出现问题。我详细咨询了一下,我猜测多出一条重复记录的原因是:并不是完全重复。原记录没有被修改,
修改过的纪录是新产生的。由于是按照id查找到记录并修改(“update...where id=...”),
所以可能把其他记录给改掉了,在造成记录重复的同时造成了记录丢失。另外,是不是和“conn.close;”有关系(在附相关代码中)
是不是在增加和修改页面退出时不能用conn.close?问题很怪,而且增加和修改在大多数情况下是正常的!!!
拜托大家能思考一下再动笔,不要盲目发帖,也不要再顶了,感激
真希望下午能解决这个怪问题!!!在线等,吃饭先!附相关代码:
增加页面中:
string str_Sql="INSERT INTO dfnotebook (riqi,name,re) VALUES ('"+riqiymd+"','"+txt1.Text.Trim()+"','"+Textarea5.Value.TrimEnd()+"')";
conn.ExeSql(str_Sql);(ExeSql函数包含了ds.Clear();myConnection.Close();)
Response.Write("<script>varhref=window.opener.document.location.href;
window.opener.document.location.href=href;</script>");(刷新DataGrid所在页面)
Response.Write("<script>alert(' 增加成功!');window.close();</script>");
(调用pageunload中的conn.Close();)修改页面中:
string str_Sql="UPDATE dfnotebook SET riqi='"+riqiymd+"',name='"+txt1.Text.Trim(),re='"+Textarea5.Value.TrimEnd()+"' where id='"+dfnotebook.idid+"'";
(在dfnotebook中有一个DataGrid,idid是记录的标识)
conn.ExeSql(str_Sql);(ExeSql函数包含了ds.Clear();myConnection.Close();)
Response.Write("<script>varhref=window.opener.document.location.href;window.opener.document.location.href=href;</script>");(刷新DataGrid所在页面)
Response.Write("<script>alert(' 修改成功!');window.close();</script>");
(调用pageunload中的conn.Close();)两个在config.cs中的函数:
public void ExeSql(string str_Sql)
{   
 Open();
 myCommand = new SqlCommand(str_Sql,myConnection);
 myCommand.ExecuteNonQuery();
 myCommand.Dispose();
 Close();
}public void Close()
{
  if (ds!=null) // 清除DataSet对象
 {
ds.Clear();
 }
  if (myConnection!=null)
 {
myConnection.Close(); // 关闭数据库
 }
}在增加和修改页面退出时:
private void Page_Unload(object sender, System.EventArgs e)
{
  conn.Close();
}

解决方案 »

  1.   

    你是指几个人同时对一条纪录修改时会这样??那可能得用application来控制,lock,unlock这样吧
      

  2.   

    看了看  感觉没有什么问题哦
    关闭数据库连接 别放在Page_Unload中
    操作完就关  看看效果如何如果是access   数据库  记得锁定看看
      

  3.   

    你的代码有些奇怪
    1、为什么在操作完成以后不重新绑定控件的数据源来刷新呢?
    2、依靠页面看到的不能判断记录的真实情况(比如用了连接查询的话,页面看不到记录但是数据库内还存在)看一下数据库的情况再分析分析
    3、为你的操作都使用事务,再试试看
    4、是不是在global.asax中做了什么操作?
      

  4.   

    1、为什么在操作完成以后不重新绑定控件的数据源来刷新呢?
    3、为你的操作都使用事务,再试试看
    +++++
    从头单步跟踪一便看看SQL语句到底执行了几次
    我以前遇到过这样的问题
      

  5.   

    1>尽量不要用自增值的字段做主键.
    2>你可以尝试设置数据库的事务隔离级别 set transaction isolation level serializable
    3>最大的可能性还是你写的代码有问题
      

  6.   

    为什么在操作完成以后不重新绑定控件的数据源来刷新呢?
      如果不重新绑定数据源,就会使DataGrid中的值和数据库中实际的值不一致!由于ADO。NET是通过存在内存中的DataSet来处理数据的(增减和修改的内容先放入内存,然后再数据库操作)。所以只刷新页面而不重绑定数据源的话,就会造成数据库和内存中存着的数据不一致。那样就会产生你的说的情况,1、刚刚增加的记录找不到,过一会又找到了。(数据库中更新了,但内存中没有同步)
        2、修改会造成两个问题:
        a、丢失刚刚修改的记录;b、多出一条重复记录(修改的错误的记录〈那原记录就都是了〉)
      

  7.   

    看到大家这么热情,我又有信心了!谢谢啦
    补充一下:1、我的数据库是SQLserver2000 
    2、并不是操作同一条记录出现问题,两个人使用本系统就会出现问题。joephoenix(迎风的狼) 和LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) :
    我认为我已经绑定了控件的数据源呀!
    ("<script>varhref=window.opener.document.location.href;window.opener.document.location.href=href;</script>");(刷新DataGrid所在页面)
    在这段代码中,DataGrid所在页面的代码的Page_Load中有:
    conn.DataGridPageLoad(str_Sql,lbl_PageMessage,lnkbtn_Prev,lnkbtn_First,lnkbtn_Next,lnkbtn_Last,DataGrid1);怎样用事务呢?我没有用过。“修改造成的两个问题”在数据库中也是这样的,确实丢失了记录并多出了重复的纪录。global.asax中的代码会有什么问题呢?
      

  8.   

    用事务:    Public Function InsertSurvey(ByVal Survey_Name As String, ByVal Preface As String, ByVal Page_Style_Begin As String, ByVal Page_Style_End As String, ByVal IP_Comp_Limit As String, ByVal Show_Result As String, ByVal End_Date As String, _
                ByVal Status As String, ByVal Create_Date As String, ByVal Operation_User As String, ByVal MyTrans As SqlTransaction, ByRef Survey_ID As Decimal) As Boolean        'Dim MyConnection As SqlConnection = New SqlConnection(_connStr)        Dim MyCommand As SqlCommand = New SqlCommand
            'MyCommand.Connection = MyConnection
            MyCommand.Connection = MyTrans.Connection
            MyCommand.Transaction = MyTrans
            MyCommand.CommandType = CommandType.StoredProcedure
            MyCommand.CommandText = "Sur_Add_Survey_SP"        MyCommand.Parameters.Add(New SqlParameter("@Survey_Name", SqlDbType.VarChar, 50))
            MyCommand.Parameters("@Survey_Name").Value = Survey_Name        If Preface <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Preface", SqlDbType.VarChar, 200))
                MyCommand.Parameters("@Preface").Value = Preface
            End If        If Page_Style_Begin <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Page_Style_Begin", SqlDbType.VarChar, 20))
                MyCommand.Parameters("@Page_Style_Begin").Value = Page_Style_Begin
            End If        If Page_Style_End <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Page_Style_End", SqlDbType.VarChar, 20))
                MyCommand.Parameters("@Page_Style_End").Value = Page_Style_End
            End If        If IP_Comp_Limit <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@IP_Comp_Limit", SqlDbType.VarChar, 100))
                MyCommand.Parameters("@IP_Comp_Limit").Value = IP_Comp_Limit
            End If        If Show_Result <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Show_Result", SqlDbType.Char, 1))
                MyCommand.Parameters("@Show_Result").Value = Show_Result
            End If        If End_Date <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@End_Date", SqlDbType.Char, 10))
                MyCommand.Parameters("@End_Date").Value = End_Date        End If        If Status <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Status", SqlDbType.Char, 1))
                MyCommand.Parameters("@Status").Value = Status        End If        If Create_Date <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Create_Date", SqlDbType.Char, 10))
                MyCommand.Parameters("@Create_Date").Value = Create_Date        End If        If Operation_User <> "" Then
                MyCommand.Parameters.Add(New SqlParameter("@Operation_User", SqlDbType.VarChar, 10))
                MyCommand.Parameters("@Operation_User").Value = Operation_User        End If        MyCommand.Parameters.Add(New SqlParameter("@Survey_ID", SqlDbType.Decimal, 9))
            MyCommand.Parameters("@Survey_ID").Direction = ParameterDirection.Output        Dim MyAdapter As SqlDataAdapter = New SqlDataAdapter(MyCommand)        Dim DS As DataSet = New DataSet        Try
                If MyTrans.Connection.State = ConnectionState.Closed Then
                    MyTrans.Connection.Open()
                End If
                MyCommand.ExecuteNonQuery()            Survey_ID = CDec(MyCommand.Parameters("@Survey_ID").Value.ToString)        Catch e As Exception
                _errcount = 1
                _errmsg = e.Message
                Return False
            Finally
                'MyConnection.Close()
            End Try        Return True
        End Function