- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
select_for_update
的 Django 文档说
Using select_for_update() on backends which do not support SELECT ... FOR UPDATE (such as SQLite) will have no effect. SELECT ... FOR UPDATE will not be added to the query, and an error isn’t raised if select_for_update() is used in autocommit mode.
在我看来,这是一个奇怪且潜在危险的决定,特别是因为 select_for_update
用于锁定行。如果我编写使用 select_for_update
的代码,我会相信它实际上会得到尊重!如果数据库后端不支持它,我希望 Django 要么回退到一种安全但效率较低的替代方案,或者如果不存在,则抛出某种异常。
在这种情况下,Django 似乎可以通过忽略不支持的数据库(例如 SQLite)上的 select_for_update
来突然且默默地重新引入竞争条件。我的直觉说 Django 不会这样做,如果不支持的话,肯定有一些原因不需要它(也许不支持的引擎使用完整的数据库锁定?),但我似乎在文档中找不到任何具体的内容来支持提出这个理论。这个问题似乎也不一定是 Django 特有的。
这让我对使用 select_for_update
非常怀疑,尽管它可以很好地解决当前的一些问题。
最佳答案
对于允许减少事务隔离以提高并发访问速度的数据库引擎(例如 PostgreSQL、Oracle 和 MySQL),SELECT FOR UPDATE 用于告诉数据库现在读取的行可能会被更新。写给以后。这可以避免并发事务中出现不一致的数据,甚至可以防止某些情况下的死锁。
在 SQLite 中,所有事务 are serializable ,即,它的行为就好像整个数据库在每个事务周围都被锁定。 (在自动提交模式下,每个语句都包装在隐式事务中。)
因此,即使实现了 SELECT FOR UPDATE,实际上也不会添加比现有锁定更多的锁定。对于 SQLite 来说,忽略它是正确的做法。
关于python - 为什么 select_for_update 对于不支持它的数据库会被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46945790/
我想创建一个模型,其 ID 等于该模型当前最大 ID 加一(如自动增量)。我正在考虑使用 select_for_update 执行此操作,以确保当前最大 ID 不存在竞争条件,如下所示: with t
我用过 select_for_update()很多。但是,在我使用过的所有情况下,它都是通过这样的经理来完成的: with transaction.atomic(): transaction
我正在做一个类似于电子商务的项目,在这个项目中,我有一些模型来表示存储中有一定数量的产品,用户可以购买一定数量的产品,只要它不超过存储的数量.我想避免在服务器收到多个购买同一产品的请求时发生竞争条件。
Django documentation指出: If you were relying on “automatic transactions” to provide locking between s
select_for_update 的 Django 文档说 Using select_for_update() on backends which do not support SELECT ...
我有一个代码,应该可以在并发请求和高负载下工作。 我写了一个例子来更好地理解我正在尝试做的事情: def add_tag(): with transaction.atomic():
我有一行整数值,该行有很多并发请求,我希望每次读取操作后都进行更新操作(增量),并保持数据一致,只能一个请求读取->同时更新。 我做了一些研究并弄清楚了 select_for_update(),我还想
我有一些代码,如果嵌套调用 select_for_update() 会简单很多,但恐怕我自己陷入了僵局。 例子: with transaction.atomic(): uu1 = UniUse
我知道如果我们有多个并发用户, select_for_update 会锁定正在查询的记录。但它是否也会影响对查询记录的评估。 例如,如果用户 A 和用户 B 基于一个 bool 变量 'Availab
我有一个由 MySQL 数据库支持的 Django 应用程序。我最近将一段代码从请求流中移出并放入了一个流程中。该代码使用 select_for_update() 锁定数据库中受影响的行,但现在我偶尔
代码崩溃 @transaction.atomic def cancel_one(o_id): order= Order.objects.select_for_update().get(id=o
如果我执行 select_for_update,该锁何时/如何释放?一些示例代码: for rec_id in list(1,2,3): record = MyModel.objects.se
有谁知道您是否可以在单个查询中同时执行 .select_for_update() 和 .select_related() 语句?如: employee = get_object_or_404(Empl
我在一个大型项目中使用 django。 我从模型的 save 内部调用 celery task,该模型调用一个方法,该方法在循环中调用另一个方法。即: celery task --> function
Django documentation州 If you were relying on “automatic transactions” to provide locking between sel
正如 Django 文档所说,select_for_update返回一个 Queryset。但是 get 没有。现在我有一个查询,我确信它只会返回一个元组。但我还需要为此事务获取锁。所以我正在做类似的
我遇到了一个奇怪的情况,当在 transaction.atomic() block 中使用 select_for_update() 时,Django 和 Postgres 中记录的查询顺序不同。 基本
我有类似的东西: newsletter = Newsletter.select_for_update().latest() newsletter.started_sending = timezone.
我有一个如下表: SELECT id, name FROM node; +----+------+ | id | name | +----+------+ | 5 | na | +----+--
我是一名优秀的程序员,十分优秀!