sql 的一个疑难杂症,有可能是这样吗?大牛请进!
一个sql语句是这样写的,没有事务,出现这种情况有可能吗?
update tableA set a='1',status='2'
where 条件
insert into tableB(field1,field2) values('1','2')
结果,tableB 插入了记录,tableA 的 a 更新为1了,status却没更新到。
怎么会这样,有可能吗?
办公室里一个从事多年编程的说,也曾遇过这样的情况。
以我的知识,很难理解会出现这种情况,大家有何高见?
------解决方案--------------------UPDATE/INSERT/DELETE是“自动提交事务”,而且无法手动回滚,也就是如果没有加begin tran,是不能用rollback。每个操作实际上可以理解为一个单独的事务,所以如果你的update失败,insert会继续操作,互相不影响
------解决方案--------------------没高见,只有基本原理和逻辑。
那是不可能的事,对技术,太多事不是靠片面的经验去推断的,必须得靠逻辑去推理
表明你同事根本不懂DB
------解决方案--------------------检查一下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')
------解决方案--------------------可以试试这样:
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
------解决方案--------------------这种事情,最好对tableA创建一个数据库审核策略,看一下到底有哪些操作对tableA做了修改。
------解决方案--------------------update tableA set a='1',status='2'
一条语句执行 2个值肯定都更新了。a的值都为1了 而status的值不为2 那么
有几种可能
1.表中有触发器更改了 status的值
2.表中有触发器更改了 a的值而没有更改status的值
回答完毕!
------解决方案--------------------只有一种可能性,日志文件记录到一半断电,然后DBCC CHECKTABLE时允许数据丢失。这种情况很罕见的,应该不会