并发请求下,数据库连续编号重复处理(一)

文章系列
  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

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


总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值