django实现悲观锁乐观锁的项目实践

 更新时间:2023年08月16日 08:55:00   作者:淘淘桃  
在Django中,我们可以通过实现悲观锁和乐观锁来保证数据的安全性,本文就来介绍一下django实现悲观锁乐观锁的项目实践,感兴趣的可以了解一下

前期准备

# 线上卖图书
    -图书表  图书名字,图书价格,库存字段
    -订单表: 订单id,订单名字
# 表准备
    class Book(models.Model):
        name = models.CharField(max_length=32)
        price = models.IntegerField()  #
        count = models.SmallIntegerField(verbose_name='库存')
    class Order(models.Model):
        order_id = models.CharField(max_length=64)
        order_name = models.CharField(max_length=32)
# 使用mysql
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'lqz',
        'PASSWORD': '123',
    }
}
# 创建lqz数据库

1.原生mysql悲观锁

begin; # 开启事务
select * from goods where id = 1 for update;  # 行锁
# order表中加数据
update goods set stock = stock - 1 where id = 1; # 更新
commit; #提交事务

2.orm实现上述(悲观锁) 

#1  使用悲观锁实现下单
@transaction.atomic  # 整个过程在一个事物中---》改两个表:book表减库存,订单表生成记录
def seckill(request):
    # 锁住查询到的book对象,直到事务结束
    sid = transaction.savepoint() # 保存点
    # 悲观锁: select_for_update()
    # 加锁了--》行锁还是表锁? 分情况,都有可能
    #
    book = Book.objects.select_for_update().filter(pk=1).first()  # 加悲观锁,行锁,锁住当前行
    if book.count > 0:
        print('库存可以,下单')
        # 订单表插入一条
        Order.objects.create(order_id=str(datetime.datetime.now()), order_name='测试订单')
        # 库存-1,扣减的时候,判断库存是不是上面查出来的库存,如果不是,就回滚
        time.sleep(random.randint(1, 4))  # 模拟延迟
        book.count=book.count-1
        book.save()
        transaction.savepoint_commit(sid)  # 提交,释放行锁
        return HttpResponse('秒杀成功')
    else:
        transaction.savepoint_rollback(sid) #回滚,释放行锁
        return HttpResponse('库存不足,秒杀失败')

3 乐观锁秒杀--》库存还有,有的人就没成功

# 2 乐观锁秒杀--普通版
@transaction.atomic
def seckill(request):
    # 锁住查询到的book对象,直到事务结束
    sid = transaction.savepoint()
    book = Book.objects.filter(pk=1).first()  # 没加锁
    count = book.count
    print('现在的库存为:%s' % count)
    if book.count > 0:
        print('库存可以,下单')
        Order.objects.create(order_id=str(datetime.datetime.now()), order_name='测试订单-乐观锁')
        # 库存-1,扣减的时候,判断库存是不是上面查出来的库存,如果不是,就回滚
        # time.sleep(random.randint(1, 4))  # 模拟延迟
        res = Book.objects.filter(pk=1, count=count).update(count=count - 1)
        if res >= 1:  # 表示修改成功
            transaction.savepoint_commit(sid)
            return HttpResponse('秒杀成功')
        else:  # 修改不成功,回滚
            transaction.savepoint_rollback(sid)
            return HttpResponse('被别人改了,回滚,秒杀失败')
    else:
        transaction.savepoint_rollback(sid)
        return HttpResponse('库存不足,秒杀失败')

到此这篇关于django实现悲观锁乐观锁的项目实践的文章就介绍到这了,更多相关django 悲观锁乐观锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pytorch 移动端部署之helloworld的使用

    pytorch 移动端部署之helloworld的使用

    这篇文章主要介绍了pytorch 移动端部署之helloworld的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Pandas DataFrame转换为字典的方法

    Pandas DataFrame转换为字典的方法

    实际开发中我们可能会遇到一类问题,如何将Pandas DataFrame转换为字典,本文就来介绍一下,感兴趣的可以了解一下
    2021-05-05
  • Matplotlib绘制子图的常见几种方法

    Matplotlib绘制子图的常见几种方法

    Matplotlib的可以把很多张图画到一个显示界面,在作对比分析的时候非常有用。本文就介绍了几种方法,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • conda虚拟环境下使用pyinstaller打包程序为exe文件全过程

    conda虚拟环境下使用pyinstaller打包程序为exe文件全过程

    pyinstaller是一个支持跨平台使用的第三方库,它可以将脚本执行所需的模块和库,自动分析、收集并生成一个文件夹或者可执行文件,这篇文章主要给大家介绍了关于conda虚拟环境下使用pyinstaller打包程序为exe文件的相关资料,需要的朋友可以参考下
    2023-12-12
  • Python相互导入的问题解决

    Python相互导入的问题解决

    大家好,本篇文章主要讲的是Python相互导入的问题解决,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • 解决更新tensorflow后应用tensorboard报错的问题

    解决更新tensorflow后应用tensorboard报错的问题

    这篇文章主要介绍了解决更新tensorflow后应用tensorboard报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 在Python程序和Flask框架中使用SQLAlchemy的教程

    在Python程序和Flask框架中使用SQLAlchemy的教程

    SQLAlchemy为Python程序与SQL语句之间建立了映射,是Python操作数据库的利器,这里我们将来看在Python程序和Flask框架中使用SQLAlchemy的教程,需要的朋友可以参考下
    2016-06-06
  • Python3+Django get/post请求实现教程详解

    Python3+Django get/post请求实现教程详解

    这篇文章主要介绍了Python3+Django get/post请求实现教程详解,需要的朋友可以参考下
    2021-02-02
  • 基于Python的微信机器人开发 微信登录和获取好友列表实现解析

    基于Python的微信机器人开发 微信登录和获取好友列表实现解析

    这篇文章主要介绍了Python微信机器人开发 微信登录和获取好友列表实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python 还原梯度下降算法实现一维线性回归

    python 还原梯度下降算法实现一维线性回归

    这篇文章主要介绍了python 还原梯度下降算法实现一维线性回归,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论