MySQL 更新更改多个列是非原子的吗?

2023-11-27

我在使用 Django 和 MySQL 5.5.22 时遇到以下问题。

给定一个包含 id、level 列和存储为 a11、a12、a21、a22 的 2x2 矩阵的表,我有这一行:

id   a11   a12   a21   a22   level
324  3     2     5     3     2

给定一个查询集 qs,我进行以下更新:

qs.update(
    a11=(b12 * a21 - b11 * a22) * F('a11') + (b11 * a12 - b12 * a11) * F('a21'),
    a12=(b12 * a21 - b11 * a22) * F('a12') + (b11 * a12 - b12 * a11) * F('a22'),
    a21=(b22 * a21 - b21 * a22) * F('a11') + (b21 * a12 - b22 * a11) * F('a21'),
    a22=(b22 * a21 - b21 * a22) * F('a12') + (b21 * a12 - b22 * a11) * F('a22'),
    level=(F('level') - 1)
    )

django 生成以下查询(从 db.connection.queries 获取,为简洁起见删除 where 子句):

UPDATE `storage` 
SET 
`a21` = (3 * `storage`.`a11`) + (-1 * `storage`.`a21`), 
`a22` = (3 * `storage`.`a12`) + (-1 * `storage`.`a22`), 
`level` = `storage`.`level` - -1, 
`a11` = (2 * `storage`.`a11`) + (-1 * `storage`.`a21`), 
`a12` = (2 * `storage`.`a12`) + (-1 * `storage`.`a22`) 

之后我的行看起来像这样:

id   a11   a12   a21   a22   level
324  2     1     4     3     1

对于任意行,a12*a21 - a11*a22 = 1应该是 True,根据这一点,该行应该是:

id   a11   a12   a21   a22   level
324  1     1     4     3     1

这就是我在 SQLite 上得到的结果,Django 生成相同的查询,我花了很多时间才发现 MySQL 正在做一些不同的事情。从查询来看,似乎在更新相互依赖的多行时,MySQL 不会将其视为单个原子操作,并且当更新列时,它们会影响依赖于它们的值。我通过 Python 提示符上的以下代码确认了这似乎是发生的情况:

>>> a11, a12, a21, a22 = (3, 2, 5, 3)
>>> (2 * a11) + (-1 * a21),\
... (2 * a12) + (-1 * a22),\
... (3 * a11) + (-1 * a21),\
... (3 * a12) + (-1 * a22)
(1, 1, 4, 3)

如果列一次更新一列,则按照查询给出的相同顺序:

>>> a11, a12, a21, a22 = (3, 2, 5, 3)
>>> a21 = (3*a11) + (-1*a21)
>>> a22 = (3*a12) + (-1*a22)
>>> a11 = (2*a11) + (-1*a21)
>>> a12 = (2*a12) + (-1*a22)
>>> (a11, a12, a21, a22)
(2, 1, 4, 3)

这确实是一个可怕的行为,因为这是一个旨在跨平台使用的库。我的问题是:

  1. MySQL 和 SQLite 哪一个做错了?这可以被视为一个错误吗?
  2. 我对其他主要数据库(Oracle、PostgreSQL 和 SQL Server)有何期望?
  3. 我可以使用 Django ORM(无原始查询)做什么来标准化此行为?

edit

问题很清楚,但我仍在寻找解决方案。对于此特定应用程序来说,拉出所有值并将其推回并不是可接受的解决方案。


PostgreSQL、Oracle 和 SQL Server 都将其视为原子操作。请参阅以下 SQL Fiddle,并切换服务器以查看以下 SQL 的行为:

CREATE TABLE Swap (
  a CHAR(1),
  b CHAR(1)
);

INSERT INTO Swap (a, b) VALUES ('a', 'b');

UPDATE Swap SET a = b, b = a;

SELECT * FROM Swap;

MySQL 是唯一实现此功能的 RBDMS,更新后两列都包含相同的值。

至于如何解决这个问题,我会从数据库中提取值,在应用程序内部进行计算(而不是更新语句),然后使用计算值更新数据库。这样您就可以保证计算将以一致的方式执行。

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

MySQL 更新更改多个列是非原子的吗? 的相关文章

  • SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

    在我的错误日志中得到大量结果 如下所列 数据库中的所有表都是 innodb 并且就与这些表的任何交互而言 一切都是带有准备好的语句的 pdo 正如我所说 所有错误几乎与下面列出的错误相同 但发生在几个不同的页面上 无论页面如何 错误行始终指
  • 使用包含空值列的 WHERE 子句的更新语句

    我正在使用另一个表中的数据更新一个表上的列 这WHERE子句基于多个列 并且某些列为空 根据我的想法 这个空值是什么throwing off你的标准UPDATE TABLE SET X Y WHERE A B陈述 See 这个 SQL 小提
  • SQL Server 中的派生表

    我有这两个疑问 我不知道如何将它们组合在一起来制作派生表 我假设使用第二个查询作为主查询 并在主查询的 FROM 子句中使用第一个查询 SELECT EmailAddress Orders OrderID SUM ItemPrice Qua
  • 我的本地 Eclipse 可以在 Docker 容器中安装 Access 库吗?

    我有一个用于 Django 开发的 Docker 映像 通过一些 xauthority 文件机制 我在容器内使用 Eclipse 在大多数情况下 Eclipse 运行良好 但存在一些棘手的问题 这些问题似乎与它在容器内运行的事实有关 毕竟
  • 使用 Powershell SQL 将数据提取到 Excel

    我想使用 powershell 将数据从 SQL Server 提取到新的 excel 文件 对于小型数据集 我的代码可以工作 但某些表的行数超过 100 000 行 这将需要很长时间 我不在 SQl 服务器中使用该实用程序的原因是因为我想
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • 如何在sqlite中添加特定数量的空行?

    我有一个SQLite文件 我想添加2550 empty NULL rows 我可以使用此代码添加一个空行 INSERT INTO my table DEFAULT VALUES 但我需要 2550 行 有什么捷径吗 我不想执行相同的代码 2
  • ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成它吗?

    我有一张桌子 上面有 除其他外 一个名字和一个等级 我想返回所有唯一名称的集合 但对于返回的每个名称 我想选择排名最高的行 这很简单 有两个嵌套的 SELECT 语句 SELECT FROM SELECT FROM foo ORDER BY
  • MYSql 前 10 名及其他总计

    我的查询运行良好 但我只需要前 10 个供应商 然后我需要将所有剩余的总计放在 所有其他 行中 如果没有单独的查询 我该如何做到这一点LIMIT 10 18446744073709551615 SELECT VENDOR fullname
  • MySql 从另一个表中减去一个表

    我有两个表 A 包含所有数据 表 B 从 A 中随机选择 25 的数据创建 所以 A 和 B 具有完全相同的列 也没有独特的列 我想做的是从 A 中减去 B 有什么想法吗 查看所有行A除了那些在B SELECT FROM A WHERE f
  • Django 本身支持迁移吗

    我听说所有新的 Web 框架 如 ROR Django 等 都遵循敏捷和 TDD 的一般原则 遵循敏捷和 TDD 的一部分是在从一个迭代到另一个迭代时制定自己的设计 这意味着模型及其架构将随着应用程序的不同版本而演变 我知道 ROR 本身支
  • 在 Doctrine DQL 中选择 count() ,并使用左连接多对多单向关系,其中用户没有关系特定组

    情况 我尝试在 DQL 中为不属于特定组的用户选择 count 标准ManyToMany之间的单向关系User and Group实体来自FOSUserBundle and SonataUserBundle 系统 Symfony 2 5 D
  • 部署 dacpac 所需的权限

    我正在尝试使用 sqlpackage exe 在租户上部署 dacpac 目前 我正在向将部署此功能的帐户授予 SysAdmin 或 db owner 权限 并且它工作正常 但在生产中 如果目标租户数据库属于其他应用程序 我可能无法获得这些
  • MySQL 中非空值的计数和分组

    我需要计算按特定 ID 分组的非空 我的意思是至少包含 1 个字符的字符串 行 例如 我的数据可能如下所示 form id mapping 1 value 1 1 1 value 2 2 2 NULL 3 value 3 我想计算每个表单的
  • SQLite 条件 ORDER BY 中的 DESC

    我需要选择按以下逻辑排序的记录 但是当 DESC 处于条件中时 SQLite 会引发错误 ORDER BY CASE WHEN parentGUID IS NULL THEN datePosted DESC ELSE datePosted
  • MySQL 和 MariaDB 数据库有什么区别?

    我已经使用 XAMPP 很长时间了 很惊讶 XAMPP 已经从 MySQL 切换到了 MariaDB https www apachefriends org index html https www apachefriends org in
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 如何告诉node.js mysql没有在默认端口上运行?

    我遇到了与此人类似的问题 连接 ECONNREFUSED 节点 js sql https stackoverflow com questions 8825342 connect econnrefused node js sql 我正在尝试将
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • 多核CPU上32位读取的原子性

    注意 我根据我认为可能提供帮助的人在哪里添加了标签到这个问题 所以请不要喊 在我的 VS 2017 64 位项目中 我有一个 32 位长值m lClosed 当我想更新它时 我使用其中之一Interlocked函数族 考虑这段代码 在线程
  • 在配置文件脚本中使用十六进制值设置 Powershell 颜色

    我知道我可以通过在我的个人资料中设置以下内容来更改 PowerShell 控制台颜色 Host UI RawUI BackgroundColor White Clear Host 但是 在 Powershell 控制台中 您可以转到 属性
  • ImageMagick 安全策略“PDF”阻止转换

    Imagemagick 安全策略似乎不允许我执行从 pdf 到 png 的转换 转换其他扩展名似乎可以工作 只是不能从 pdf 转换 自从安装以来 我没有更改任何 imagemagick 设置 如果操作系统很重要的话 我正在使用 Arch
  • 从 Eclipse 调试在 ScriptEngine 中运行的 Groovy 脚本

    我有一个 Groovy 脚本 其运行方式如下 File scriptFile ScriptEngine engine String script FileUtils readFileToString scriptFile Object ev
  • 以编程方式添加单词进行单词预测的问题

    我在用用户字典 Words班级的addWord功能将单词添加到词典中 以便它们可以显示在文本预测中 这些词确实存在于字典中APP ID 0并可用于默认的 Android 键盘 然而 我使用的是 Swift 键盘 它没有考虑这些词的预测 我正
  • Angular4 中的自定义字体导入

    我使用 Angular4 但在使用自定义字体时遇到问题 我尝试使用 font face 但它给了我无法找到字体文件的错误 我需要做什么才能包含此文件以便在我的组件中使用它 font face font family lcd plain sr
  • 如何“docker exec”从头构建的容器?

    我在尝试着docker exec从头开始构建的容器 例如 NATS 容器 看起来很简单 但由于它是从头开始构建的 我无法访问 bin bash bin sh以及任何此类命令 我收到错误 oci runtime error 找不到命令 找不到
  • Windows 8 Metro 应用程序文件共享访问

    我正在开发一个 Windows 8 Metro 应用程序 我们打算将其部署到我们公司内的几台平板电脑上 它不适用于 Windows 应用商店 我们需要该应用程序访问公司网络共享上的某些目录 但强制用户使用FilePicker这不是我们想要的
  • 使用什么来代替 Object.keys()?

    我需要在 Jquery 中找到一些可以在 IE8 和真实浏览器中工作的东西 我是 Jquery 的新手 以下是我在现代浏览器中运行的代码 FIELD office id on change function offices this val
  • ASP.NET MVC 子域

    我有这样的托管和域名 www EXAMPLE com 我创建了几个这样的子域 www PAGE1 EXAMPLE com www PAGE2 EXAMPLE com www PAGE3 EXAMPLE com etc 所有这些子域都指向同一
  • 如何为多个 servlet 配置 spring security?

    我想在 spring mvc 应用程序中使用 spring security 该应用程序由两个模块组成 一个 前端 和一个管理模块 两个模块都有自己的调度程序 servlet 具有不同的映射 因此它们确实有自己的 Web 上下文 但共享相同
  • MySQL查询超时:(70100):查询执行被中断

    我想执行 MySQL 查询以删除所有Wp posts表行其中post parent is a Wp posts排与post type设置为产品 So I do INSERT INTO temp SELECT DISTINCT id FROM
  • 基于 C 的应用程序/项目的文件和文件夹结构 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 基于 C 编程语言的应用程序 项目的一般结构是什么 库 包括 头文件 等等等等 班级结构是什么 在 OOps 中 需要可扩展和其他功能 类似 mai
  • NodeJS 中将字符串从 utf8 转换为 latin1

    我使用的是 Latin1 编码的数据库 无法将其更改为 UTF 8 这意味着我遇到了某些应用程序数据的问题 我正在使用 Tesseract 对文档进行 OCR tesseract 以 UTF 8 编码 并尝试使用 iconv lite 但是
  • 将内存转储到文件

    我想将一部分内存转储到文件中 一个原因是将信息保存在某个地方 另一个原因是当我的程序重新启动时再次读取它 这样做的正确方法是什么 我的第一个想法是 char start my pointer int i for i 0 i lt MEMOR
  • 过程指针,派生类型

    以下内容无法在 Intel Fortran XE 2011 中编译 TYPE type1 procedure interface1 POINTER p END TYPE type1 ABSTRACT INTERFACE integer fu
  • Firebase 错误:W/BiChannelGoogleApi:[FirebaseAuth:] getGoogleApiForMethod() 返回 Gms

    这是我的注册活动 我正在尝试使用 Firebase 创建一个 createUserWithEmailAndPassword 并向用户的个人资料添加一些详细信息 例如全名 地址和电话号码 我想在使用电子邮件和密码创建用户时在分配给新用户的 用
  • SolidJS:控制台日志中的“在`createRoot`或`render`之外创建的计算将永远不会被释放”消息

    在处理 SolidJS 项目时 您可能会开始在 JS 控制台中看到以下警告消息 computations created outside a createRoot or render will never be disposed Solid
  • 使用故事板的优点和缺点

    我计划学习使用故事板开发应用程序 任何人都可以发布使用 StoryBoards 时的一些优点和缺点吗 何时使用 Storyboard 以及何时使用 XIB 在 iOS 编程中使用 Storyboard 代替 xib 文件有什么好处 ipho
  • MySQL 更新更改多个列是非原子的吗?

    我在使用 Django 和 MySQL 5 5 22 时遇到以下问题 给定一个包含 id level 列和存储为 a11 a12 a21 a22 的 2x2 矩阵的表 我有这一行 id a11 a12 a21 a22 level 324 3