当前位置: 首页 > 面试题库 >

Django:如何防止数据库条目的并发修改

单于俊智
2023-03-14
问题内容

是否可以防止两个或多个用户同时修改同一数据库条目?

向用户显示错误消息以执行第二次提交/保存操作是可以接受的,但是数据不应被静默覆盖。

我认为锁定条目不是一种选择,因为用户可能会使用“后退”按钮或只是关闭浏览器,从而永远保持锁定状态。


问题答案:

这就是我在Django中进行乐观锁定的方式:

updated = Entry.objects.filter(Q(id=e.id) && Q(version=e.version))\
          .update(updated_field=new_value, version=e.version+1)
if not updated:
    raise ConcurrentModificationException()

上面列出的代码可以作为Custom Manager中的方法实现。

我做出以下假设:

  • filter()。update()将导致单个数据库查询,因为filter是惰性的
  • 数据库查询是原子的
    这些假设足以确保之前没有其他人更新过该条目。如果以这种方式更新了多行,则应使用事务。

警告 Django Doc:

请注意,update()方法直接转换为SQL语句。这是直接更新的批量操作。它不会在模型上运行任何save()方法,也不会发出pre_save或post_save信号



 类似资料:
  • 问题内容: 我们有三个Web服务(,,),其中每个服务映射到一个方法(在一个单独的Java类)( ,,)。 只能同时运行一项服务(即:无法在运行时运行)。但是,由于这是REST API,因此无法阻止客户端请求并发运行的服务。 在服务器上 强制 服务 不能 同时运行的最佳和最简单的方法是什么? 更新 :这是一个内部应用程序,我们的负载不会很大,只有一台应用程序服务器。 更新 :这是一个主观的问题,因

  • 问题内容: 每次我通过贝宝付款时,我的信息都会在数据库中捕获,但我想防止重复。那么我该如何解决呢?还是应该检查电子邮件重复项? 编辑 据我所知,pinnaclecart将uid设置为primary。所以将它设置为唯一不是“危险”吗? 问题答案: 名字和姓氏都很好,但是除了唯一之外,其他一切都没有。我认识几个与我同名的人,因此我猜想在这两列上建立唯一索引只会令人沮丧,而无济于事。但是,使我与众不同的

  • 问题内容: 说我像这样创建一些对象类 现在,我想创建一个arraylist来容纳许多这样的对象类。 我想包含某种逻辑,以便在这种情况下…当我们尝试添加对象“ second”而不是向arrayList添加新对象时,我们将second.getNum()添加到first.getNum()。因此,如果要遍历ArrayList,它将是 我在想出一种优雅的方式来解决这个问题时遇到了麻烦。随着arraylist

  • 问题内容: 我想防止使用vb.net和MySQL作为数据库的清单表单中出现重复条目​​,这是我的代码: 结束子 我在搜索答案时发现了这个问题,但是当我尝试运行它时,它没有读取插入命令,而是即使没有相同的人员ID也会直接转到msbox“人员ID已经存在”。 有人可以检查为什么不阅读插入内容, 我的数据库表值: pcode =主键 lname =长文本 fname =长文本 办公室=长文本 名称=长文

  • 问题内容: 我有一个表,用于存储有关某些事件重复发生的值,例如,与发生在星期一,星期三和星期五的事件,以及与发生在星期一和星期三的事件。所以我的桌子是这样的: 我的问题是有时(并非总是)我的脚本在数据库中插入重复的值,因此我的表的事件1和2的重复发生率是两倍,如下面的表所示: 如果我在列中添加约束,则事件1仅具有星期一值,但我希望该值具有其余值,例如星期三和星期五。如何添加约束来解决此问题? 问题

  • 根据规范,当使用写入模式时,Hazelcast执行以下操作: 通过将write-delay-seconds属性设置为0,可以将MapStore配置为直写。这意味着条目将同步放入数据存储区。