文章系列
  1. 并发请求下,数据库连续编号重复处理(一)http://t.csdn.cn/jhoH7

  2. 并发请求下,数据库连续编号重复处理(二)icon-default.png?t=N176http://t.csdn.cn/jkpfj


前言

在并发环境下,数据库内数据连续编号无法保证不重复,本文就问题复现,并给出解决方案


一、业务背景

同一张数据表内,根据不同类型,每个类型进行递增排序,类型数量不确定

二、数据库准备

1.创建数据表

SQL如下:

CREATE TABLE [dbo].[Students] (
  [StudentID] uniqueidentifier  NOT NULL,
  [Type] int  NOT NULL,
  [Number] int  NOT NULL
)
GO

2.读取最大值,连续编号10条,并存入数据库

代码如下:

int findMax = _context.Students.AsNoTracking().Where(t => t.Type == 0).DefaultIfEmpty().Max(t => t.Number);
List<Student> students = new List<Student>();
for (int i = 0; i < 10; i++)
{
        students.Add(new Student
        {
              Type = 0,
              Number = ++findMax,
        });
}
_context.Students.AddRange(students);
_context.SaveChanges();

3.运行项目,启动20线程,每个线程运行10次

4.查询数据库数据

SQL如下:

SELECT  Students.Number,count(*) as count FROM [dbo].[Students] GROUP BY Students.Number order by count desc

可以看到并发下面大量异常插入,这里就要想办法如何保障排序的唯一性,下一章给出思路解决过程


总结

本文记录了问题的发现,下面接着是解决方法路程

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐