一个sql语句是这样写的,没有事务,出现这种情况有可能吗?update tableA set a='1',status='2'
where 条件insert into tableB(field1,field2) values('1','2')结果,tableB 插入了记录,tableA 的 a 更新为1了,status却没更新到。
怎么会这样,有可能吗?办公室里一个从事多年编程的说,也曾遇过这样的情况。
以我的知识,很难理解会出现这种情况,大家有何高见?
 
sql 奇怪的事情疑难杂症

解决方案 »

  1.   

    UPDATE/INSERT/DELETE是“自动提交事务”,而且无法手动回滚,也就是如果没有加begin tran,是不能用rollback。每个操作实际上可以理解为一个单独的事务,所以如果你的update失败,insert会继续操作,互相不影响
      

  2.   

    避免这种情况的最好方法是加上显式事务,并用try/catch对重要部分做管控
      

  3.   

    以上我理解。
    但,问题是,update 一个字段成功,另外一个字段不成功,有可能会这样吗?
      

  4.   

    以上我理解。
    但,问题是,update 一个字段成功,另外一个字段不成功,有可能会这样吗?
      

  5.   

    好像听过这种情况,但是没听过有最终答案,status是否有外键、约束、触发器等?
      

  6.   

    检查一下tableA和tableB上是否有触发器.select a.name 'tablename',b.name 'triggername'
     from sys.tables a
     inner join sys.objects b on a.object_id=b.parent_object_id and b.type='TR'
     where a.name in('tableA','tableB')
      

  7.   

    另一种可能是,在更新tableA之后,到LZ查询tableA.status字段数据之间,有其他进程修改了其值.
      

  8.   

    你的名称是学号?呵呵,这么像我大学时候的学号
    敢问LZ是WYU的吗?
      

  9.   

    你的名称是学号?呵呵,这么像我大学时候的学号
    敢问LZ是WYU的吗?

    嗯,大你一届吧。很高兴这里有一个高手校友哦。
      

  10.   

    同意10楼的看法,或许你update 就没有执行成功,二所谓“更新”了的字段,恰好原来就是这个值
      

  11.   

    可以试试这样:declare @tb table(a varchar(20),status varchar(20))update tableA set a='1',status='2'
    output a,status into @tb
    where 条件insert into tableB(field1,field2)
     values('1','2')
     
    --查看被update的记录,在update之前的值
    select * from @tb
      

  12.   

    这种事情,最好对tableA创建一个数据库审核策略,看一下到底有哪些操作对tableA做了修改。
      

  13.   

    update tableA set a='1',status='2'
    一条语句执行 2个值肯定都更新了。a的值都为1了 而status的值不为2 那么
    有几种可能
    1.表中有触发器更改了 status的值
    2.表中有触发器更改了 a的值而没有更改status的值
    回答完毕!
      

  14.   

    只有一种可能性,日志文件记录到一半断电,然后DBCC CHECKTABLE时允许数据丢失。这种情况很罕见的,应该不会