python django设计流水号生成,带访问加锁,重试

2023-11-09

python django设计流水号生成,带访问加锁,重试

老规矩,技术发于业务,努力从于项目。

1、设计一个流水号配置表如下:
# 流水号配置表
class BaseSerialNum(BaseModel):
    serial_type = models.CharField(verbose_name="流水号类型", max_length=10, unique=True)
    prefix = models.CharField(verbose_name="流水号的前缀字符", max_length=10, blank=True, null=True)
    serial = models.IntegerField(verbose_name="流水号的序列", default=0)
    serial_digit = models.IntegerField(verbose_name="流水号的位数", default=4)
    # 默认 前缀字符 + 年月日 + 流水号
    format = models.CharField(verbose_name="流水号的格式", max_length=10, blank=True, null=True)

    class Meta:
        verbose_name = '流水号配置表'
        verbose_name_plural = verbose_name
        db_table = "base_serial_num"
2、编写函数如下:

这里django版本太低了,如果稍微高一点,可以在select_for_update 这里多定义一个变量timeout

def get_serial_num(serial_type):
    # 当前时间
    now_time = datetime.now()
    today = now_time.date()
    formatted_date = now_time.strftime('%Y%m%d')

    # 获取流水号配置信息时对数据加锁  使用FOR UPDATE语句加上排它锁,以避免并发问题
    for i in range(3):  # 重试三次
        try:
            with transaction.atomic():
                # SELECT ... FOR UPDATE 语句用于加锁,避免并发问题
                # 如果锁不可用,则等待0.3秒  如果还获取不到则抛出异常
                serial_obj = BaseSerialNum.objects.select_for_update(nowait=True).get(serial_type=serial_type)

                last_update_time = serial_obj.update_time
                serial = serial_obj.serial
                if last_update_time and last_update_time.date() == today:
                    serial += 1
                else:
                    serial = 1
                result = BaseSerialNum.objects.filter(id=serial_obj.id).update(serial=serial, update_time=now_time)
                # 未更新成功重试
                if result == 0:
                    continue

                serial_number = serial_obj.prefix + formatted_date + '{:0{length}d}'.format(serial,
                                                                                            length=serial_obj.
                                                                                            serial_digit)
                return True, serial_number
        # 如果不存在抛出异常
        except ObjectDoesNotExist:
            return False, f"流水号类型参数 {serial_type} 未定义"
        # 获取不到锁异常 等待0.3秒重试
        except OperationalError:
            time.sleep(0.3)
            continue

    # 重试3次后依然失败,返回None
    return False, None
3、编写视图类如下:
# 流水号配置
class BaseSerialNumView(BaseViewSet):
    serializer_class = BaseSerialNumSerializer
    queryset = BaseSerialNum.objects.all().order_by("-id")

    # 生成流水号接口
    @action(methods=["get"], detail=False)
    def get_serial_num(self, request):
        req_data = request.query_params.copy()

        serial_type = req_data.get("serial_type")
        if not serial_type:
            return ReturnData(msg=f"缺少流水号类型参数", code=401)

        result, data = get_serial_num(serial_type)

        if not result:
            return ReturnData(msg=f"获取失败{data}", code=402)

        return ReturnData(msg=f"获取成功", code=200, data={"serial_num": data})

打完收工 芜湖~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python django设计流水号生成,带访问加锁,重试 的相关文章

  • 保留完整姓氏,在 pandas 列中获取名字的首字母(如果有的话,还有中间名)

    我有一个 pandas 数据框 其中有一列表示几位网球运动员的姓氏和姓名 如下所示 Player 0 Roddick Andy 1 Federer Roger 2 Tsonga Jo Wilfred 我想保留完整的姓氏并获取姓名的首字母和中
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 重定向到 /admin/login/ 结果为 302

    当用户未经身份验证时 我尝试重定向到登录页面 在我的settings py我的课程有 MIDDLEWARE CLASSES path to AuthRequiredMiddleware 这是我的课程 class AuthRequiredMi
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • Django 的 request.FILES 出现 UnicodeDecodeError

    我在视图调用中有以下代码 def view request body u for filename f in request FILES items body body Filename filename n f read n 在某些情况下
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • Django 基于类的视图上的 success_url 的反向抱怨循环导入

    当使用基于方法的视图时 重定向为reverse没有抱怨这一点 并且仍然可以找到 root url conf 但是 在基于阶级的观点中 它抱怨 ImproperlyConfigured at blog new post The include
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • 连接mysql和python.3

    我是 django 的新手 使用 django 1 5 和 python 3 3 有没有办法在 python 3 3 上安装 mysqlDB 或 有其他方法可以连接它们吗 PyMySQL https github com petehunt
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这

随机推荐

  • DuiLib使用教程之二---测试工程

    DuiLib测试工程 以下内容为原创 欢迎转载 转载请注明 来自试着不呼吸的博客 http blog csdn net haiqiang softwo article details 21485283 通过上节 http blog csdn
  • 短视频APP是如何开启你的美好生活的?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯视频云终端团队发表于云 社区专栏 常青 2008 年毕业加入腾讯 一直从事客户端研发相关工作 先后参与过 PC QQ 手机QQ QQ物联 等产品项目 目前在腾讯视频云团队负
  • 多态和虚函数的基本概念和用法

    C 多态 多态按字面的意思就是多种形态 当类之间存在层次结构 并且类之间是通过继承关联时 就会用到多态 C 多态意味着调用成员函数时 会根据调用函数的对象的类型来执行不同的函数 多态的优点 代码组织结构清晰 可读性强 利于前期和后期的扩展以
  • steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

    前言 时不可以苟遇 道不可以虚行 今天的的前言诗句特地百度搜索了一下 诗句大概的意思是 时机是不可能随便就能遇到的 道路也要一步一步踏实地行走 象征着好运的诗句 之所以特地去找这样意思的诗句 主要的原因是 今天就是四六级考试 想给自己带来一
  • 利用Python(netCDF4库)读取.nc文件(NetCDF气象数据文件)的基本操作

    NetCDF network Common Data Form 网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准 目前 NetCDF广泛应用于大气科学 水文 海洋学 环境模拟 地球物理等诸多领域 用户可以借助多种方式方便
  • LeetCode--初级算法--字符串类算法

    反转字符串 题目 编写一个函数 其作用是将输入的字符串反转过来 示例 1 输入 hello 输出 olleh 示例 2 输入 A man a plan a canal Panama 输出 amanaP lanac a nalp a nam
  • flask配置https协议

    感谢https blog csdn net qq 33934427 article details 127456673 文中多有参考再实践 一 要用https协议需要有ca证书 在windows10先下载windows版本openssl 地
  • uni-app (路由)

    介绍 uni app页面路由为框架统一管理 开发者需要在pages json里配置每个路由页面的路径和页面样式 类似的小程序在app json中配置页面路由相同 所以uni app的路由用法与Vue Router不同 如仍希望采用Vue R
  • Android12及所有版本解决没有system读写权限(只需要magisk面具)

    通过magisk挂载文件的方式来修改system 不用解锁system或挂载读写 前提条件 你要确保你已经正确刷入了Magisk 刷面具保姆级别教程 举一反三 多种手机通用 这个方法实际上就相当于刷模块来达到修改的目的 本文只是给小白普及一
  • 时间同步服务chrony的简单配置

    一 chrony服务器的简介 chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件 它能让计算机保持系统时钟与时钟服务器 NTP 同步 因此让你的计算机保持精确的时间 Chrony也可以作为服务端软件为其他计算机提供时间
  • vue-router安装失败

    当安装vue router遇到以下问题 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resol
  • 食品PC端的轮播图的文字和图片怎么修改

  • C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式 1 更改Form designer cs文件 将控件的设为Public 供子窗体访问 在designer cs文件的最后 找到你的控件声明 private System Windows Forms T
  • Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法 使用官方提供的windeployqt工具 Qt 官方开发环境使用的动态链接库方式 在发布生成的exe程序时 需要复制一大堆 dll 如果自己去复制dll 很可能丢三落四 导致exe在别的电脑里无法正常运行 因此 Qt
  • 深入浅出理解视频编码H264结构(内涵福利)

    转自 https www jianshu com p 9522c4a7818d 在国内直播 欣欣向荣 ps 其实大多都亏钱 为的就是炒概念 的年代 相信很多小伙伴也投入了技术的浩瀚大洋当中 ps 其实就是搬砖 日复一日 音 视频的神秘面纱开
  • 区块链100篇之将fabric部署在k8s上

    有了上一篇的基础 这一篇就尝试将fabric部署在k8s上 以下的操作的前提条件是自己已经对docker compose部署fabric比较熟悉了 可以先搞清楚fabricase目录下的fabric raft项目 1 修改DNS 在真正开始
  • DS证据理论浅析

    在DS证据理论中 由互不相容的基本命题 假定 组成的完备集合称为识别框架 表示对某一问题的所有可能答案 但其中只有一个答案是正确的 该框架的子集称为命题 分配给各命题的信任程度称为基本概率分配 BPA 也称m函数 M A 为对A的信任程度大
  • 绿源电动车通过聆讯:​年营收48亿 为倪捷与胡继红家族企业

    雷递网 雷建平 9月20日 绿源集团控股 开曼 有限公司 简称 绿源电动车 日前通过聆讯 准备在香港上市 这意味着时隔近一年后 绿源电动车终于拿到了上市的钥匙 年营收47 8亿 绿源电动车创建于1997年 总部位于浙江金华 绿源产品涵盖电动
  • matlab数学建模-神经网络:测试不同隐藏层神经元的个数、更改学习函数

    目录 通过误差 和训练步数对比 确定隐含层个数 并检验隐含层个数对性能的影响 1 trainlm 算法 2 traingdm 算法 3 trainrp 算法 4 traingdx 算法 5 traincgf 算法 通过误差 和训练步数对比
  • python django设计流水号生成,带访问加锁,重试

    python django设计流水号生成 带访问加锁 重试 老规矩 技术发于业务 努力从于项目 1 设计一个流水号配置表如下 流水号配置表 class BaseSerialNum BaseModel serial type models C