SQL 是怎样查询的

mycodeis0000 2012-02-29 09:53:31
我想知道SQL数据库在查询过程中是怎样一个流程
比如我要查询5条数据

select * from tableName

id name
1 张三
2 李四
3 王五
4 赵六
5 田七


数据是一条一条查询出来的? 如果是
那么比如现在查询到第四条数据了
1 张三
2 李四
3 王五
4 赵六
那么在还未查出所有数据之前我对第一条数据进行UPDATE

UDPATE tableName set name='小明' where id=1


那么查询出来id为1的 name 是'小明' 还是 '张三'

...全文
118 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
勿勿 2012-03-02
  • 打赏
  • 举报
回复
+1
[Quote=引用 2 楼 josy 的回复:]
update之前查是张三,update之后查是小明
[/Quote]
aiouw 2012-03-02
  • 打赏
  • 举报
回复
貌视查询的时候会先放置共享锁的吧,查询完了,才能更新吧...跟锁和隔离级别有关...可以找这些资料
anlianganl 2012-03-01
  • 打赏
  • 举报
回复
肯定是‘张三’的
mycodeis0000 2012-02-29
  • 打赏
  • 举报
回复
用事务得到了验证

select top 3 Fid,Fdate from HR_ATS_EmpRoster order by fid
BEGIN TRANSACTION
Begin
select top 3 Fid,Fdate from HR_ATS_EmpRoster order by fid
update HR_ATS_EmpRoster set Fdate='2012-02-19' where Fid=1
COMMIT
end
select top 3 Fid,Fdate from HR_ATS_EmpRoster order by fid


Fid Fdate
----------- -----------------------
1 2012-02-25 00:00:00.000
2 2010-01-01 00:00:00.000
3 2010-01-01 00:00:00.000

(3 行受影响)

Fid Fdate
----------- -----------------------
1 2012-02-25 00:00:00.000
2 2010-01-01 00:00:00.000
3 2010-01-01 00:00:00.000

(3 行受影响)

(1 行受影响)

Fid Fdate
----------- -----------------------
1 2012-02-19 00:00:00.000
2 2010-01-01 00:00:00.000
3 2010-01-01 00:00:00.000

(3 行受影响)


即使更新为 '小明'
查询出的来应该还是张三
nigolarer 2012-02-29
  • 打赏
  • 举报
回复
同意楼上的看法。如果没有锁的话很多类似的问题都会造成各种意外
kavaye 2012-02-29
  • 打赏
  • 举报
回复
建议您去看看SQL语句的执行步骤,您这个查询第一步是从FROM 开始,从TABLEname 返回所有数据,当你看到这个结果的时候,查询已经结束!你也可以参考锁的概念!当数据查询时,数据库会自动给这些数据一定的锁,来保证这些数据在查询完之前不被其他语句修改!
mycodeis0000 2012-02-29
  • 打赏
  • 举报
回复
请问用事务的话 需要怎样验证呢?
这个事务应该怎样写?
mycodeis0000 2012-02-29
  • 打赏
  • 举报
回复
不是有这样的需求 而是有这样的问题需要分析系
我们现在 在做数据同步,但是在同步数据过程中有可能会有用户做update操作
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mycodeis0000 的回复:]

to josy

SQL 已经查询到第四条数据了

在还未查询完所有数据之前对第一条数据进行update 为小明
查询出来的还是小明么?

为什么不是张三呢?
[/Quote]

怎么还有这种需求

试试用事务处理
mycodeis0000 2012-02-29
  • 打赏
  • 举报
回复
to josy

SQL 已经查询到第四条数据了

在还未查询完所有数据之前对第一条数据进行update 为小明
查询出来的还是小明么?

为什么不是张三呢?


UserA_dmin 2012-02-29
  • 打赏
  • 举报
回复

报错、SQL跟代码差不多一样,都是从上往下执行。如果你UPDATE接SELECT后面,第一次查询出来是‘张三’
如果是在前面就是‘小明’
百年树人 2012-02-29
  • 打赏
  • 举报
回复
update之前查是张三,update之后查是小明
xuam 2012-02-29
  • 打赏
  • 举报
回复
你自己试试了,按事物来处理的.

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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