日期:2014-05-17  浏览次数:20537 次

现象貌似事务未提交,但数据又变更过了
上午有发生灵异事件
同一条UPDATE语句,同事更新两个字段,有一个字段更新成功,另一字段未更新成功
Update tuser set state=1 ,operator='xgg' where vchno=2034134
整个处理逻辑执行成功,但数据库里只看到state记录更新成功了,operator没有更新成功
抓取了数据库的快照,中间没有任何异常发生,程序也没发生任何异常

程序处理流程如下 :
第一步:
update tlog set operator='xgg' where id=2034134
第二步:
Update tuser set state=1 ,operator='xgg' where vchno=2034134
之后完成,事务提交

现在数据库的现象是tlog表未更新
tuser 表的state字段更新了,operator字段未更新

------解决方案--------------------
--#1.我只能说,不可能
--#2.楼主把所有的语句放到TRY...CATCH...中,测试是否会有异常产生。如果没有,参考#3
--#3.用下面代码测试:
BEGIN TRY
BEGIN TRAN
select operator FROM tlog where id=2034134 --旧数据
update tlog set operator='xgg' where id=2034134
select operator FROM tlog where id=2034134 --新数据

SELECT [state],operator FROM tuser where vchno=2034134 --旧数据
Update tuser set [state]=1,operator='xgg' where vchno=2034134
SELECT [state],operator FROM tuser where vchno=2034134 --新数据
COMMIT
END TRY
BEGIN CATCH
SELECT 'have a error:'  + ERROR_MESSAGE()
END CATCH

------解决方案--------------------
引用:
嗯,我认为是自己逻辑导到致的BUG,业务执行十分简单,两条UPDATE语句后,事务提交,早上点九点一刻发生的,查了一上午,无果呀

#1.你不能排除那个时间点有其它操作(人为或JOB等)也在操作这个表的数据
#2.如果现在的逻辑没有问题。那么这个历史BUG不好重现的话,原因不好查
#3.建议楼主,再测试一下现在的SQL,如果没问题。只能等待下次重现了。如果可以,给表加个触发器,记录一下相关字段的操作日志。或用其它方法来监控。