使用 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 数据库分页查询(三种方式)