- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我感兴趣的是 SELECT FOR UPDATE
查询是否会锁定不存在的行。
表 FooBar
有两列,foo
和 bar
,foo
有一个唯一索引.
SELECT bar FROM FooBar WHERE foo = ?更新
INSERT INTO FooBar (foo, bar) 值 (?, ?)
现在 INSERT
是否有可能导致索引违规,或者 SELECT FOR UPDATE
是否可以阻止这种情况?
对 SQLServer (2005/8)、Oracle 和 MySQL 上的行为感兴趣。
最佳答案
MySQL
SELECT ... FOR UPDATE with UPDATE
使用 InnoDB 事务(关闭自动提交),SELECT ... FOR UPDATE
允许一个 session 临时锁定一个(或多个)特定记录,以便其他 session 无法更新它。然后,在同一事务中, session 实际上可以对同一记录执行 UPDATE
并提交或回滚事务。这将允许您锁定记录,以便在您执行其他一些业务逻辑时没有其他 session 可以更新它。
这是通过锁定来实现的。 InnoDB 利用索引来锁定记录,因此锁定现有记录似乎很容易——只需锁定该记录的索引即可。
SELECT ... FOR UPDATE with INSERT
但是,要将 SELECT ... FOR UPDATE
与 INSERT
一起使用,您如何为尚不存在的记录锁定索引?如果您使用的是 REPEATABLE READ
的默认隔离级别,InnoDB 也将使用 gap 锁。只要您知道要锁定的 id
(或什至 id 范围),InnoDB 就可以锁定间隙,这样在我们完成它之前,其他记录都不能插入该间隙。
如果您的 id
列是一个自动递增列,那么 SELECT ... FOR UPDATE
和 INSERT INTO
就会有问题,因为您在您插入之前不会知道新的 id
是什么。但是,由于您知道要插入的 id
,因此使用 INSERT
的 SELECT ... FOR UPDATE
将起作用。
警告
在默认隔离级别上,SELECT ... FOR UPDATE
对不存在的记录不会阻止其他事务。因此,如果两个事务都对同一个不存在的索引记录执行 SELECT ... FOR UPDATE
,它们都将获得锁,并且两个事务都无法更新记录。事实上,如果他们尝试,就会检测到死锁。
因此,如果您不想处理死锁,您可能只需执行以下操作:
插入...
开始交易,并执行INSERT
。执行您的业务逻辑,然后提交或回滚事务。一旦您在第一个事务的不存在的记录索引上执行 INSERT
,所有其他事务如果尝试 INSERT
具有相同唯一索引的记录,它们将被阻止.如果第二个事务在第一个事务提交插入后尝试插入具有相同索引的记录,那么它将得到“重复键”错误。相应地处理。
选择 ... 锁定在共享模式
如果您在 INSERT
之前使用 LOCK IN SHARE MODE
选择,如果先前的事务已插入该记录但尚未提交,则 SELECT 。 .. LOCK IN SHARE MODE
将阻塞,直到上一个交易完成。
因此,为了减少重复键错误的可能性,特别是如果您在执行业务逻辑时持有锁一段时间,然后再提交或回滚它们:
SELECT bar FROM FooBar WHERE foo = ?锁定更新
INSERT INTO FooBar (foo, bar) VALUES (?, ?)
关于sql - 当行不存在时, "SELECT FOR UPDATE"是否会阻止其他连接插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601895/
我刚开始学习JSP技术,遇到了瓶颈。 如何从 JSP 声明 block ? 这不起作用: ... 服务器说没有“out”。 U: 我确实知道如何使用返回字符串的方法重写代码,但是有没有办法在 ?
在一个字段中,我想设置一个具有自定义过滤器的自定义分析器-着眼于词干-因此,“闪存卡”和“闪存卡”的词根相同,因此返回的结果相同 当我运行以下查询时,我的命中率很高,但是“闪存卡”和“闪存卡”各自返回
快速提问。 我有一个通过 PInvoke 使用 native DLL 的应用程序,这个 DLL 可能会调用 PostQuitMessage()。 如何避免? (因为我的应用程序不应该关闭) 我试过 A
一些给定的 HTML 文章,例如: Content 与一些基本的 Jquery 结合使用,例如: $(".some_
我正在构建一个灯箱相册。当第一个图像加载时,CSS 转换起作用。当加载后的每个图像都没有。任何想法为什么?加载第一张之后的照片,但没有过渡。 Image.prototype.load = functi
这个问题在这里已经有了答案: Disable recent tasks button on Android 5.0 (2 个答案) 关闭 2 年前。 我知道这个问题之前在这里被问过 Android
我是 Objective-C 的新手,我只是想弄清楚我是否可以使用 block 或选择器作为 UIAlertView 的 UIAlertViewDelegate 参数 - 哪个更合适? 我已经尝试了以
我是 Linux (UNIX) 套接字下套接字编程的新手。我在 Internet 上找到了以下代码,用于为每个连接生成一个线程的 tcp 服务器。但是它不起作用。accept() 函数立即返回,不等待
recv()库函数手册页提到: It returns the number of bytes received. It normally returns any data available, up
我有一个用于其他项目的共享 ts 库。在这个库中有被同一个库的其他资源使用的资源。该库的结构分为 components/*、interfaces/*、services/* 等目录。在每个目录的根目录中
我想在同一行中一个接一个地显示我的 ListView ,但 ListView 显示每个新行中的每个项目。我怎样才能防止换行显示。以便它显示为段落 ListView.builder( shr
我有一个包含数千行的表格。 import React from "react" import { useSelector } from "react-redux"; import { useEffec
假设我通常希望收到关于代码中不完整模式的警告,但有时我知道某个函数的模式不完整,我知道这很好。 是still true GHC 的警告粒度是每个模块的,并且没有办法更改有关特定功能或定义的警告? 最佳
我的网络应用程序发送浏览器通知,我知道如何检查通知的浏览器权限,以及如果未授予权限,如何请求权限。 但是,即使用户授予我的站点发送通知的权限,她可能仍然无法收到通知,因为它们 might be dis
我有 Xcode 3.2.1,并且喜欢使用它,但是当我编辑文本中带有超链接的文件时(例如,带有引用的注释:# see http://example.com)Xcode 将文本变成可点击的超链接。尝试编
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我有一个在 MY_Controller 中运行的 acl。如果权限被拒绝,那么此刻,我只是执行 redirect('denied') - 这是一个非常基本的 Controller ,它加载一个非常基本
我一直很好奇尝试从 Chrome 切换到 Firefox Quantum,但是对于 Web 开发遇到了一个我无法轻松解决的主要障碍——它正在缓存我的本地主机文件,因此当我尝试在本地主机加载各种 emb
这真的让我很兴奋!在任何时候,我都会参与多个项目。当我退出Xcode时,下次打开Xcode时,我前一天的所有项目都会自动一一打开。 经常我最终编辑错误的文件,AHHHHHHHHHHH!我可以阻止这种行
我的Wiki上有500个左右的Spambot和大约5个实际注册用户。我已经使用nuke删除了他们的页面,但是他们一直在重新发布。我已经使用reCaptcha控制了spambot的注册。现在,我只需要一
我是一名优秀的程序员,十分优秀!