SqlServer数据库分页查询问题排查

发布时间 2023-10-03 10:38:42作者: strongmore

使用 docker 安装

下载镜像

docker search mssql-server
docker pull datagrip/mssql-server-linux

创建容器

docker run -d --name sqlserver -p 1433:1433 -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=szz123456' datagrip/mssql-server-linux

ACCEPT_EULA 需要设置为Y以接受SQL Server的许可协议,而 SA_PASSWORD 是用于SA管理员账户的密码。客户端连接时使用 sa/szz123456。

数据准备

创建表及插入数据

drop TABLE tb_user;

create table tb_user(
  uid int identity(1,1) PRIMARY key,
  uname varchar(20),
  birthday datetime 
);


SELECT * FROM tb_user;

delete from tb_user;

insert into tb_user(uname,birthday) values('lisi1','2023-10-02 18:10:10');
insert into tb_user(uname,birthday) values('lisi2','2023-10-02 18:10:10');
insert into tb_user(uname,birthday) values('lisi3','2023-10-02 18:10:20');
insert into tb_user(uname,birthday) values('lisi4','2023-10-02 18:10:20');
insert into tb_user(uname,birthday) values('lisi5','2023-10-02 18:10:30');
insert into tb_user(uname,birthday) values('lisi6','2023-10-02 18:10:30');
insert into tb_user(uname,birthday) values('lisi7','2023-10-02 18:10:40');
insert into tb_user(uname,birthday) values('lisi8','2023-10-02 18:10:40');
insert into tb_user(uname,birthday) values('lisi9','2023-10-02 18:10:50');
insert into tb_user(uname,birthday) values('lisi10','2023-10-02 18:10:50');

问题复现

分页查询

select * from tb_user order by birthday desc offset 5 row fetch next 1 row only;

根据日期排序,日期存在一致的数据(如购物车订单,创建时间都一样),正好分页的数据是购物车订单的一部分,分页查询出的数据出错,每次返回的数据可能不一致,对于上面的查询, 既可能是 lisi5 也可能是 lisi6。不过现在又复现不出来了。

简单解决方法:对于购物车订单,日期增加几十毫秒

参考

docker 安装sqlserver
Sqlserver 数据库分页查询(三种方式)