一个疑惑的问题,路过的兄弟们帮忙看看....

jixiaojie 2006-06-05 10:38:22
create table tb1(c1 int,c2 int)

insert into tb1
select 1,2

go

select * from tb1

--初始值:c1=1 ,c2=2
--1 2


update tb1
set c1=c2,c2=c1

select * from tb1

--更新后:c1=2,c2=1(这里很疑惑,为什么不是c1=2,c2=2,那位大虾帮忙指点一下,谢谢!)
--2 1

go

drop table tb1
...全文
201 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixiaojie 2006-06-07
  • 打赏
  • 举报
回复
自己顶一下
  • 打赏
  • 举报
回复
update的操作是将where条件的数据取出来,放入缓存,通过缓存的信息来实现数据的存取,所以会出现C1和C2不一致的情况。
jixiaojie 2006-06-06
  • 打赏
  • 举报
回复
谢谢楼上几位....

大家有什么见解,请不要保留,共享一下....您的一句话可能帮我很大忙

谢谢大家了^_^
LouisXIV 2006-06-06
  • 打赏
  • 举报
回复
update是一步执行的

看过trigger的deleted和inserted就知道了
itblog 2006-06-06
  • 打赏
  • 举报
回复
可以这样理解:
执行UPdate数据前,首先要进行对表进行扫描,然后用扫描结果(此时的结果只代表数值,可以说跟表没有关系)去更新表。
Reeezak 2006-06-05
  • 打赏
  • 举报
回复
是这样的,正如cowboy_tt()所说

UPDATE是一次性执行的,并非分布执行

SELECT之类也是一样
jixiaojie 2006-06-05
  • 打赏
  • 举报
回复
看书越看越糊涂,想了好久都想不明白,大虾们指点一下吧.....
jixiaojie 2006-06-05
  • 打赏
  • 举报
回复
谢谢回复,能再具体点吗?详细解释一下这个update执行过程吗?

比如:
什么时候从IO读取数据?
什么时候加的锁?
锁怎么防止其他人修改数据?
缓存在内存的数据和磁盘数据是不是还保持一定的关系?
当更新完毕后,什么时候记录的日志,什么时候将数据写入磁盘?
checkpoint是什么东西?什么时候发生?
如果更新完毕,数据还没有写入磁盘,系统当机,SQL回怎么回滚这批数据?

这些东西,我概念上很朦胧,请指点,谢谢!
cowboy_tt 2006-06-05
  • 打赏
  • 举报
回复
因为他的更新方式是先把原来的记录读出来.然后一下更新的,所以会得到对换的情况.而你的理解是先做第一步,c1=c2,然后C2=C1,你把等号两边的C1和C2给混淆了.我们可以假设他是这样执行的.先把C1,C2读出,然后往C1里放的是开始读到的C2,往C2里放的是开始读到的C1,而最后一个C1是执行这句话前的C1,而不是执行C1=C2后的C1.总结,set c1=c2,c2=c1这句话他是一次执行,而并非分步执行.

22,210

社区成员

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

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