高并发下的数据更新

Django中的数据更新机制

众所周知,在Django使用ORM机制来对SQL语句做封装,从而实现简单、统一的数据查询机制,并且通过Queryset机制极大程度减少频繁的数据库存取。

但是,在我们当前的项目中,会用到高并发的定时任务,并且存在对同一条数据的字段修改的情景,这就造成了可能的脏写、甚至数据库死锁。

好在Django已经存在对类似问题的解决办法,那就是使用事务 + select_for_update

事务

数据库中的事务概念:构成单一逻辑工作单元的操作集合。

其中的概念是非常多且复杂的,如果需要讲清楚需要单独再开一篇文章来学习。
这里只需要知道,事务是一个单元操作

悲观锁

在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作读某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。

悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。

简而言之,悲观锁主要用于保护数据的完整性。当多个事务并发执行时,某个事务对数据应用了锁,则其他事务只能等该事务执行完了,才能进行对该数据进行修改操作。

实际使用

在Django中,开启事务的方式一般有两种:

  • 使用装饰器
  • 使用上下文管理器

个人来说,一般喜欢使用上下文管理器,也就是:

 with transaction.atomic():
 		# 所需要定义为事务的代码逻辑

同时,Django中在进行filter时,还支持一种行级锁:select_for_update需要注意的是必须用在事务里面,否则会查询出错,返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SELECT … FOR UPDATE 语句。

所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。

一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞,直到锁被释放。 如果这不想要使查询阻塞的话,使用select_for_update(nowait=True)。 如果其它事务持有冲突的锁,互斥锁, 那么查询将引发 DatabaseError 异常。你也可以使用select_for_update(skip_locked=True)忽略锁定的行。 nowait和  skip_locked是互斥的,同时设置会导致ValueError。

目前,postgresql,oracle和mysql数据库后端支持select_for_update()。 但是,MySQL不支持nowait和skip_locked参数,因此在我们的项目中也只是单纯的使用select_for_update()而不带有任何参数

使用不支持这些选项的数据库后端(如MySQL)将nowait=True或skip_locked=True转换为select_for_update()将导致抛出DatabaseError异常,这可以防止代码意外终止。

同时,这种事务机制是嵌套的,也就是说,假如我们有一段逻辑使用了select_for_update,在外层的时候我们可以统一使用with transaction.atomic(),这样一整个逻辑都是属于事务的一部分了。

参考文献:
Django事务和锁
MySQL中的悲观锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT是一款跨平台的C++图形用户界面应用程序开发框架,支持高并发解析数据的例子主要有以下几种场景: 1. 网络通信:在网络通信过程中,需要不断地接收和解析数据。例如,一个实时的聊天应用程序,当有大量用户同时发送消息时,服务器需要高并发地接收和解析这些消息,并进行相应的处理和转发。 2. 数据库操作:在数据库操作过程中,可能会涉及到大量的查询和更新操作。例如,一个在线商城的电子支付系统,当有多个用户同时访问时,需要高并发地查询用户的账户余额,并进行相应的扣款或充值操作。 3. 多线程处理:QT提供了多线程编程的支持,可以将一个任务拆分成多个子任务,并利用多个线程并发地处理。例如,一个图片处理程序,当需要同时处理多张图片时,可以将每张图片的处理放在一个独立的线程中进行,从而实现高并发的图片处理。 4. 并行计算:QT中的QtConcurrent框架可以帮助我们实现并行计算。例如,一个大数据处理程序,当需要对大量数据进行计算时,可以将计算任务拆分成多个子任务,利用多线程并发地进行计算,从而提高计算速度和效率。 综上所述,QT提供了丰富的工具和功能来支持高并发解析数据的场景,无论是网络通信、数据库操作、多线程处理还是并行计算,都可以通过QT的相关组件和框架来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值