SQL2000(SP4) + vb.net应用客户端。客户端应用从输出的log看已保存完成,而且已经打印了含有结算时间流水小票(事务后的处理)。
但还原当天晚上的数据库备份文件,发现对应数据的结算时间没有了。数据恢复到了结算前的状态。一个有4条数据出错。出错前发生过超时错误。2011-11-15 21:29:13 Microsoft OLE DB Provider for SQL Server
2011-11-15 21:29:13 ExecuteReaderInternal
2011-11-15 21:29:13 超时已过期
2011-11-15 21:29:13    在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   在 ClassLib.F009.Btn_SelectSave_Click(Object sender, EventArgs e)
2011-11-15 21:33:52 Microsoft OLE DB Provider for SQL Server
2011-11-15 21:33:52 ExecuteReaderInternal
2011-11-15 21:33:52 超时已过期
2011-11-15 21:33:52    在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   在 ClassLib.F009.Btn_SelectSave_Click(Object sender, EventArgs e)2011-11-15 21:34:31 Microsoft OLE DB Provider for SQL Server
2011-11-15 21:34:31 ExecuteReaderInternal
2011-11-15 21:34:31 超时已过期
2011-11-15 21:34:31    在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   在 ClassLib.F009.Btn_SelectSave_Click(Object sender, EventArgs e)
2011-11-15 21:35:12 Microsoft OLE DB Provider for SQL Server
2011-11-15 21:35:12 ExecuteReaderInternal
2011-11-15 21:35:12 超时已过期
2011-11-15 21:35:12    在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   在 ClassLib.F009.Btn_SelectSave_Click(Object sender, EventArgs e)请帮忙分析原因。分不够再加。

解决方案 »

  1.   

    数据库每天凌晨2点备份,备份放在服务器上。我将备份还原到本机SQLSever上了。
      

  2.   

    SQL2000的實例屬性,有一個登陸超時設置,你看看是否這里設置有正確
      

  3.   

    >>4条sql执行超时,就没有执行
    你说的不对。
    是查询了4次,都超时了。而接下来的登录更新处理,从log上看都通过了。
    而且我手上有通过后打印的小票,是从数据库里面查询出来的。说明当时已经登录成功了。
    接下来12:00以后会对当天数据进行备份,但是从备份还原后没有找到成功登录的数据。从log上看,超时现象出现后,操作员没有关闭软件,而且进行了后续的登录操作。
    我想了解的是,超时操作会对事务什么的有影响吗。
      

  4.   

    确认整个事务执行正常,且提交(commit tran)正常吗?
      

  5.   

    代码结构如下:
                Try
                    Dim tran As OleDb.OleDbTransaction
                    tran = DBConnection.BeginTransaction                ..........业务登录代码                tran.Commit()
                    tran.Dispose()
                    Me.Close()            Catch ex As Exception
                    tran.Rollback()
                    Logger.WriteLog(ex, DBConnection)
                    MsgBox(ex.Message, MsgBoxStyle.Critical, Constant.CON_TITLE_ERR)
                Finally
                    tran.Dispose()
                End Try
    我觉得我写的异常处理应该没有问题。中间的业务登录log都正常输出了。而且也没有异常的log信息。
      

  6.   

    我的推测,请帮助分析可能性。由于网络原因,导致软件超时,并发出通知SQL数据库回滚指令。但回滚指令超时了(或在SQLServer端阻塞了)。而接下来,操作员马上进行了3次登录,从log和打印的小票看,这3次登录都成功了。
    这时回滚指令开始执行,按照时间点进行回滚,导致已经登录的3条数据也被回滚了。不知道这的事是否可能发生?
      

  7.   

    刚测试过,事务过程中如果超时,事务没有自动回滚,应该是超时错误被Catch捕获,然后在异常处理模块里就执行了tran.Rollback()而你前面的打印小票已经完成了.