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

为什么不支持select_for_update的数据库会简单地忽略它?

万修为
2023-03-14
问题内容

Django文档select_for_update

在不支持SELECT … FOR UPDATE的后端(例如SQLite)上使用select_for_update()将无效。SELECT …
FOR UPDATE将不会添加到查询中,并且如果在自动提交模式下使用select_for_update(),则会引发错误。

这让我震惊,这是一个奇怪且潜在危险的决定,尤其是因为select_for_update它用于锁定行时。如果我编写使用的代码select_for_update,那么我将依靠它而感到荣幸!如果数据库后端不支持它,我希望Django会退回到一种安全但效率较低的替代方法,或者如果不存在,则会抛出某种异常。

在这种情况下,似乎Django可以通过忽略不受支持的DB(例如SQLite)而突然 无声地
重新引入竞争条件select_for_update。我的直觉说Django不会这样做,并且一定有某些原因为什么不需要支持就不需要它(也许不支持它的引擎使用完整的数据库锁定?),但是我似乎找不到任何具体的文档来支持提出那个理论。看来这个问题也不一定是特定于Django的。

select_for_update尽管这可以很好地解决当前的一些问题,但是这使我非常谨慎。


问题答案:

使用允许减少事务隔离以提高并发访问速度的数据库引擎(例如PostgreSQL,Oracle和MySQL),SELECT FOR
UPDATE用于告知数据库现在读取的行将在以后写入。 。这样可以避免在并发事务中显示不一致的数据,甚至可以防止在某些情况下出现死锁。

在SQLite中,所有事务都是可序列化的,即,其行为就像整个数据库都围绕着每个事务锁定一样。(在自动提交模式下,每个语句都包装在一个隐式事务中。)

因此,即使执行了SELECT FOR UPDATE,实际上也不会添加比已经存在的锁定更多的锁定。对于SQLite,忽略它是正确的事情。



 类似资料:
  • 在我的flutter应用程序中,我导入了flutter库。然而,这个库目前不支持flutter Web。图书馆不是我的应用程序使用的必要条件。 主要问题:是否有任何方法来检查导入的库是否不受支持,然后在这种情况下我可以删除部分UI和代码?

  • 问题内容: 我正在尝试在包级别使用Hibernate @TypeDef批注,这与Hibernate文档中所描述的完全相同。我正在使用和。代码可以编译,并且在类路径中,但是Hibernate仍然看不到它。 如果我上课,那是行得通的,但是如果我把放在那,那是没有用的。我试图用Google搜索,但找不到任何有用的信息。 谢谢! 问题答案: 您可能需要添加一个 到您的Hibernate配置文件,或调用co

  • 问题内容: 我有一个带有关系的实体,我想通过一个查询来检索它,因此使用。有时,Hibernate不尊重它,而是发出N + 1 秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。 这是带有我使用的注释的简化实体: 用 我希望单个查询能够同时获取其及其内容,例如 相反,我得到了第一选择所有N S和那么N 献给所有S(考虑没有缓存)。 我发现了许多类

  • 我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束

  • 日志上说: 警告:com.flurry.android.ab:找不到引用类com.google.ads.interstitialad警告:com.flurry.android.ab:找不到引用类com.google.ads.interstitialad警告:com.flurry.android.ab:找不到引用类com.google.ads.interstitialad警告:com.flurry.

  • 问题内容: 我将Spring 3.1.3用于Web应用程序,将XML配置与组件扫描结合使用。 我意识到,其中一个扫描组件必须在其他几个组件之前进行初始化。在所有需要构造后初始化的类上,我在方法上具有@PostConstruct批注。 为了设置依赖关系顺序,我在需要先后构造的类上将“ @Component”更改为“ @Component(“ configData”)”。然后,在每个需要在“ conf