SQL2000(SP4),客户端应用从输出的log看已保存完成,可又发生了回滚。

jsjzzh 2011-11-18 12:13:52
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)

请帮忙分析原因。分不够再加。
...全文
107 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjzzh 2011-11-18
  • 打赏
  • 举报
回复
数据库每天凌晨2点备份,备份放在服务器上。

我将备份还原到本机SQLSever上了。
-晴天 2011-11-18
  • 打赏
  • 举报
回复
你是在本机还原数据库的,还是另外用一台机还原后分析的?
唐诗三百首 2011-11-18
  • 打赏
  • 举报
回复
这里仅仅是猜测,真的读懂的话应该可以自己修改一下程序试试咯.
我没你的完整代码,也不懂你们的业务逻辑,帮不上忙.
[Quote=引用 12 楼 ap0405140 的回复:]
刚测试过,事务过程中如果超时,事务没有自动回滚,

应该是超时错误被Catch捕获,然后在异常处理模块里就执行了tran.Rollback()

而你前面的打印小票已经完成了.
[/Quote]
jsjzzh 2011-11-18
  • 打赏
  • 举报
回复
有什么方法可以避免吗

之前的查询调用了存储过程,存储过程里有事务处理,但没有写回滚处理。
唐诗三百首 2011-11-18
  • 打赏
  • 举报
回复
刚测试过,事务过程中如果超时,事务没有自动回滚,

应该是超时错误被Catch捕获,然后在异常处理模块里就执行了tran.Rollback()

而你前面的打印小票已经完成了.
jsjzzh 2011-11-18
  • 打赏
  • 举报
回复
我的推测,请帮助分析可能性。

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

不知道这的事是否可能发生?
jsjzzh 2011-11-18
  • 打赏
  • 举报
回复
代码结构如下:
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信息。
唐诗三百首 2011-11-18
  • 打赏
  • 举报
回复
确认整个事务执行正常,

且提交(commit tran)正常吗?
jsjzzh 2011-11-18
  • 打赏
  • 举报
回复
>>4条sql执行超时,就没有执行
你说的不对。
是查询了4次,都超时了。而接下来的登录更新处理,从log上看都通过了。
而且我手上有通过后打印的小票,是从数据库里面查询出来的。说明当时已经登录成功了。
接下来12:00以后会对当天数据进行备份,但是从备份还原后没有找到成功登录的数据。

从log上看,超时现象出现后,操作员没有关闭软件,而且进行了后续的登录操作。
我想了解的是,超时操作会对事务什么的有影响吗。
中国风 2011-11-18
  • 打赏
  • 举报
回复
SQL2000的實例屬性,有一個登陸超時設置,你看看是否這里設置有正確
中国风 2011-11-18
  • 打赏
  • 举报
回复
建議去VB.NET版問問
快溜 2011-11-18
  • 打赏
  • 举报
回复
4条sql执行超时,就没有执行
jsjzzh 2011-11-18
  • 打赏
  • 举报
回复
说的具体点啊。服务器上事务会有什么问题。
--小F-- 2011-11-18
  • 打赏
  • 举报
回复
会不会是你服务器上事务本身的问题。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧