为什么 SELECT FOR UPDATE 只能在事务中起作用?

2023-12-20

我想我很困惑选择更新 https://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html构造。
例子:

mysql> select * from employees2;  
+-------+----------+--------+-----------+  
| EmpId | EmpName  | DeptId | EmpSalary |  
+-------+----------+--------+-----------+  
|     1 | John     |      1 |   5000.00 |  
|     2 | Albert   |      1 |   4500.00 |  
|     3 | Crain    |      2 |   6000.00 |  
|     4 | Micheal  |      2 |   5000.00 |  
|     5 | David    |   NULL |     34.00 |  
|     6 | Kelly    |   NULL |    457.00 |  
|     7 | Rudy     |      1 |    879.00 |  
|     8 | Smith    |      2 |   7878.00 |  
|     9 | Karsen   |      5 |    878.00 |  
|    10 | Stringer |      5 |    345.00 |  
|    11 | Cheryl   |   NULL |      NULL |  
+-------+----------+--------+-----------+  
11 rows in set (0.00 sec)  

我在脚本中执行以下操作:

#!/usr/bin/perl  
use strict;  
use warnings;  

use DBI;  

my $dbh = DBI->connect('dbi:mysql:testdb','root','1234', {'RaiseError' => 1, 'AutoCommit' => 0}) or die "Connection Error: $DBI::errstr\n";  
my $sql = "select * from employees2 where EmpId IN (2,10) for update";   
my  $sth = $dbh->prepare($sql);  
$sth->execute or die "SQL Error: $DBI::errstr\n";  
while (my @row = $sth->fetchrow_array) {  
   print "@row\n";  
}   
sleep(9000);  
$dbh->commit;  

我还并行一个控制台并连接到数据库。
所以我运行脚本first然后在另一次会议中我这样做:

mysql> select * from employees2 where EmpId IN (10) for update;   

第二个选择块,因为它引用同一行。
这会阻止我这样做:

mysql> set autocommit = 0; 
mysql> begin;   
mysql> select * from employees2 where EmpId IN (10) for update;   
mysql> commit;     

要不就

mysql> select * from employees2 where EmpId IN (10) for update;   

因此,无论是否在事务中,它都会阻塞无关紧要的事情。
现在,如果我将脚本更改为:

my $dbh = DBI->connect('dbi:mysql:practice','root','') or die "Connection Error: $DBI::errstr\n";  

即脚本确实not在一个事务内运行第二个会话不会阻塞!
为什么会阻塞only脚本是否在事务中运行?


根据文档 https://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html:

使用锁定行进行更新SELECT FOR UPDATE仅在禁用自动提交时适用(通过使用以下命令开始事务)START TRANSACTION或者将自动提交设置为 0。如果启用自动提交,则不会锁定符合规范的行。

换句话说,如果你不执行你的第一个SELECT FOR UPDATE在事务内部,没有行被锁定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 SELECT FOR UPDATE 只能在事务中起作用? 的相关文章

  • 如何从准备好的语句中获取标量结果?

    是否可以将准备好的语句的结果设置为变量 我正在尝试创建以下存储过程 但失败了 第 31 行出现错误 1064 42000 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 stmt USING m c a 附
  • MySql 5.0 可以查看位于另一台服务器上的表吗

    MySql 5 0 视图可以使用位于另一台服务器上的表吗 创建这样的视图的语法是什么 联合表 http dev mysql com doc refman 5 0 en federated storage engine html http d
  • sed:用匹配的模式替换第 n 个单词?

    我有一个具有以下特征的文本文件 每行至少有三个由空格分隔的 单词 单词 可以是任何字符或字符串 我在一些行中附加了一些注释 并提出了对原始单词进行更改的初步建议 现在想使用 sed 为我进行这些更改 因此 为了提供更清晰的图片 我的文件如下
  • JS 无法查询 MySQL 数据库。错误:connection.query 不是函数

    尝试查询我的 mySQL 数据库 但我不能 因为我得到了TypeError connection query is not a function错误 有谁知道为什么吗 我不知道为什么会发生这种情况 数据库 js const fs requi
  • mysql utf8_general_ci 区分大小写

    我有一个 mysql 数据库 我使用 utf8 general ci 不区分大小写 在我的表中 我有一些列 例如 ID 和区分大小写的数据 例如 iSZ6fX 或 AscSc2 为了区分大写和小写 最好只在这些列上设置 utf8 bin 如
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • 浏览器关闭后从数据库中删除

    我正在开发一个电子商务应用程序 但问题是 当用户将产品添加到购物车并在订购前关闭浏览器时 购物车会带走所有产品 所有购物车项目都保存在表中 如果用户关闭浏览器而不订购 我只想刷新购物车 您可以使用 Javascript 事件捕获浏览器关闭并
  • MySql 完全联接(联合)和多个日期列的排序

    一个相当复杂的 sql 查询 我可能使它变得更加困难 我有两张桌子 消息 newsid 日期时间 新闻文本 图片 图片ID 日期时间 imgPath 两者没有关系 我只是在新闻 图片创建的日期之前加入 到目前为止的 SQL SELECT F
  • MySQL 命令输出在命令行客户端中太宽[重复]

    这个问题在这里已经有答案了 我在用mysql终端模拟器中的命令行客户端lxterminal在Ubuntu中 当我运行以下命令时 mysql gt select from routines where routine name simplep
  • 将表与同一个表的前一条记录连接起来

    我有一个包含历史记录的表 由主表中的多个触发器发布到那里 我想在历史表上创建一个 select 语句 其中每个记录都由其先前的记录 由相同的 LineID 和最高的 ActionDate 标识 连接 这样我就可以提取这两者之间的差异 我尝试
  • 为什么没有调用回调?

    我有来自的示例脚本B OP检查 https metacpan org pod B OPCheck SYNOPSIS模块经过修改PL op name to padsv https github com Perl perl5 blob blea
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • 如何在 Perl 中找到普通文本和 JSON 编码文本之间的差异?

    我用过JSON 任意 http search cpan org dist JSON Any在我的程序中在客户端和服务器之间传输哈希值 我遇到一个问题 我想知道文本 客户端发送的 是普通文本还是 JSON 编码文本 谁能告诉我如何找到 未经检
  • 使用 JOIN 和 UNION 合并不同表中的记录

    我需要创建一个查询来组合两个表中的数据 我认为可能是 JOIN 和 UNION 的组合 在此示例中 我需要列出状态处于活动状态的所有姓名 仅一次 并将他们的葡萄酒 苏打水 晚餐 甜点和水果偏好组合起来 按姓名排序 我不确定单独的 JOIN
  • Mysql - 如何比较两个 Json 对象?

    将整个 MySql json 列与 json 对象进行比较的语法是什么 以下不起作用 select count criteria from my alerts where criteria industries 1 locations 1
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • 计算行数并仅获取表中的最后一行

    我有一张桌子叫employeexam其结构和数据是这样的 id course id employee id degree date 1 1 3 8 2013 01 14 2 2 4 15 2013 01 14 3 2 4 17 2013 0
  • 如何将另一列的整数值添加到日期列?

    我试图将整数添加到日期 但出现以下错误 1064 你的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在第 6 行的 wp OrderDate INTERVAL WPProduct Duration DAY AS
  • 在 MySQL 中搜索多个单词

    我使用 HTML 表单来允许用户查找数据库表中的条目

随机推荐

  • $ 和 $.fn 有什么区别?

    我很好奇 不知道之间的区别 and fn 谁能详细向我解释一下吗 还有什么是 fn 是一个函数 具体来说 是一个指向jQuery函数 别名 fn是该函数的一个属性 它指向内部函数的原型initjQuery 用于创建实例的函数 正如我们在 j
  • 当时间落在时间范围内时返回 True?

    我正在制作一个函数来检查 24 小时格式的时间范围内的时间 但是我的代码有一些问题 有人可以指出如何修复吗 My code bool isDoTime int starthour int startminute int endhour in
  • CreateIoCompletionPort 中的并发线程数

    On MSDN 页面CreateIoCompletionPort http msdn microsoft com en us library aa363862 28v VS 85 29 aspx该函数的最后一个参数有一个非常简短的描述 并发
  • 在 ngFor 中声明变量

    在我的 angular2 项目中 我需要呈现一个矩阵 这是我当前的代码 tr td class worker lastName br worker firstName td td class sk table sub header div
  • redshift Convert_timezone 不起作用

    使用 Razor SQL 运行 Redshift 查询时 UTC 日期似乎被视为本地时区 并包含夏令时 例如 运行 SELECT first CONVERT TIMEZONE UTC America New York 2016 03 27
  • 方法“ToString”没有重载需要 1 个参数

    我有一个数据读取器来从数据库读取数据 我正在从销售表中读取 TotalPrice 我想将总价显示为小数点后两位 该代码是一些链接 TotalPrice Text myReader TotalPrice ToString N2 但是我遇到了这
  • Android JSONArray 循环

    这是我从网络服务得到的结果 year 2014 2013 2012 2011 2010 2009 2008 2007 2006 2005 2004 2003 2002 2001 2000 1999 1998 1997 1996 1995 1
  • 并行 make:将 -j8 设置为默认选项

    我可以使用以下命令设置构建过程的线程数 j争论 比如我有4核 4虚拟 当我写的时候 make j8速度增加4倍 是否可以将该值设置为默认值 例如 在Linux Gentoo中 在配置文件中 可以设置这个默认值 附注我有 Arch Linux
  • Windows 10 高分辨率屏幕上的 Spyder 界面图标非常小

    我有一台全新的笔记本电脑 分辨率为 3840 x 2160 运行 Windows 10 在安装 Anaconda Spyder 进行 python 编码后 我注意到图标非常小 对象检查器部分的文本也非常小 有没有办法来解决这个问题 这似乎与
  • 如何在 ANSI C 的结构中使用枚举?

    下面的代码必须在主函数中使用 但我不知道它是如何使用的 struct SomeItem enum MOVIE MUSIC itemType union struct Movie movie struct Music music 该结构用于带
  • Highchart js 最多可绘制 15 个图

    我在 Highchart js 中进行了很多尝试 但仍然找不到减少系列中元素数量的方法 如果我获得超过 15 天的数据 我必须将其减少并以 15 天的数据形式向用户显示 以便用户可以在不拥挤的情况下查看数据 该系列最多有 90 天 我必须减
  • IntelliJ IDEA 仅运行/调试一个文件

    我在 IntelliJ IDEA 中有一个 JAVA 项目 有多个包 但我的包中的某些文件有自己的main 方法并且可以自己运行 但是 如果我右键单击给定文件并选择 调试 运行 File main IntelliJ 将尝试构建包中的所有文件
  • ASP.NET MVC 3 中是否可以有多个依赖解析器?

    ASP NET MVC 3 中是否可以有多个依赖解析器 类似于 ModelBinder 和 Provider 的情况 我可以想到一种场景 拥有多个 容器 或 解析器 是有用的 那就是多租户 通过多租户 您可以在同一个 Web 应用程序中运行
  • 禁用 g++ 的返回值优化

    我需要在命令行上使用什么标志来禁用 g 编译器自动启用的返回值优化 fno elide constructors C 标准允许实现省略创建临时对象 该临时对象仅用于初始化相同类型的另一个对象 指定此选项会禁用该优化 并强制 G 在所有情况下
  • Android:调整位图大小而不损失质量

    在发布之前我确实搜索了整个网络 我的问题是 我无法在不损失图像质量的情况下调整位图大小 质量非常差并且像素化 我从相机获取位图 然后必须缩小它的尺寸 这样我就可以更快地将其上传到服务器 这是进行采样的函数 public Bitmap res
  • 继承自 HtmlHelper 而不是扩展它

    我正在创建一组用于渲染兼容的助手推特引导程序 http twitter github com bootstraphtml 在我看来 当谈到如何将这些方法组合在一起时 我有两种选择 扩展 HtmlHelper 在方法中添加 TB 前缀 创建一
  • Python正则表达式匹配<之前的单词

    所以我想匹配这样的东西 foo
  • 当前日期与日期字段之间的天数

    我有这个问题如果有人可以帮忙的话 有一个字段 date 在我的桌子上 table1 这是格式为的日期3 31 1988 M D y 我需要定义自该日期以来已经过去了多少天 我试图给出这个指示 SELECT DATEDIFF CURDATE
  • Angularjs,对表中选定的复选框应用操作

    我正在尝试学习 AngularJS 并实现此复选框 当我从网格中选择一些复选框并单击 删除 按钮时 应从选定的复选框中删除表中的数据 我尝试过但不知道如何实现它 请参阅我在 Plunker 上的这段代码 http plnkr co edit
  • 为什么 SELECT FOR UPDATE 只能在事务中起作用?

    我想我很困惑选择更新 https dev mysql com doc refman 5 0 en innodb locking reads html构造 例子 mysql gt select from employees2 EmpId Em