如何查询table中第1000到2000条纪录?

博客介绍了table表数据分页查询的两种方法。一是当表中无唯一值列时,临时添加identity列查询后再删除;二是当表中某列值唯一时,使用not in子查询实现分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

table1(col1 int,col2 varchar(100))

1:如果table1中没有唯一值得列
临时给table1加上一个identity列,查询完后再drop掉
alter table table1 add  NewID int identity(1,1)
select col1,col2 from table1 where NewID>=1000 and NewID<=2000
alter table table1 drop column NewID

2.如果table1中col1的值唯一,也可以如下
select top 2000 * from table1 where col1 not in (select top 1000 col1 from table1)

### 不可重复读与幻读的区别 #### 不可重复读 (Non-Repeatable Read) 不可重复读是指在一个事务中多次查询同一数据时,由于其他事务对该数据进行了更新操作并提交,导致当前事务前后两次查询得到的结果不一致。这种现象主要发生在数据库的隔离级别较低的情况下[^3]。 例如,在某个事务中首次查询记录的值为 `100`,但在另一个事务修改该记录并将值更改为 `200` 后提交,则原事务再次查询此记录时会发现其值已变为 `200`。这正是典型的不可重复读问题[^4]。 #### 幻读 (Phantom Read) 幻读则是指在同一个事务中,基于相同的查询件执行两次查询时,因其他事务插入新的满足件的数据而导致结果集中出现了额外的记录。换句话说,幻读关注的是查询结果集合的变化而非单个记录的内容变化[^5]。 比如,假设事务 T1 执行了一次针对特定件下的记录数统计,随后另一事务 T2 插入了一些符合这些件的新纪录并完成提交;当回到事务 T1 再做一次同样的计数时就会发现总数增加了——即产生了所谓的“幽灵”般的新增项。 --- ### 发生场景对比 | **特性** | **不可重复读** | **幻读** | |-------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | **定义** | 在同一事务中,读取到的数据被其他事务修改,导致读取到的值不同。 | 在同一事务中,两次相同查询时,新增数据导致查询结果集不同。 | | **影响范围** | 查询结果中的某记录的值不同。 | 查询结果的记录数量不同(多了或少了记录)。 | | **典型例子** | 事务 T1 首先查得某员工工资为 `$1000`,之后事务 T2 将其改为了 `$1200` 并提交,T1 再次查询显示为 `$1200`。 | 假设事务 T1 初始查询得出有两符合件的记录,而事务 T2 插入第三符合件的记录后提交,T1 再次查询则会有三记录。 | --- ### MySQL 解决方案 对于上述两种问题,MySQL 提供了不同的解决方案: - 对于 **不可重复读**,通过实现 MVCC(Multi-Version Concurrency Control),即使在高并发环境下也能保障事务间的一致性和独立性。具体来说,在 RR (Repeatable Read)及以上隔离级别下,每次读取都会获取一致性视图,从而避免了不可重复读的发生。 - 关于 **幻读**,尽管 RR 级别可以防止大部分情况下的幻读,但如果涉及到了 “当前读”,仍可能出现幻读现象[^2]。为此,InnoDB 存储引擎引入了间隙锁机制来彻底杜绝这一隐患。它不仅锁定实际存在的行,还会对索引间的空隙加锁,阻止其他事务在此范围内插入新数据,进而有效解决了幻读问题。 ```sql -- 使用 SELECT ... FOR UPDATE 或者 LOCK IN SHARE MODE 进行当前读以触发间隙锁 SELECT * FROM table_name WHERE condition LIMIT n FOR UPDATE; ``` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值