文章系列
前言
在并发环境下,数据库内数据连续编号无法保证不重复,本文就问题复现,并给出解决方案
一、业务背景
同一张数据表内,根据不同类型,每个类型进行递增排序,类型数量不确定
二、数据库准备
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
可以看到并发下面大量异常插入,这里就要想办法如何保障排序的唯一性,下一章给出思路解决过程
总结
本文记录了问题的发现,下面接着是解决方法路程