了解 pdo mysql 事务

2024-02-17

The PHP 文档 http://php.net/manual/en/pdo.transactions.php says:

如果您以前从未遇到过交易,他们提供 4 种主要的交易方式 特点:原子性、一致性、隔离性和持久性(ACID)。在 通俗地说,就是在交易中进行的任何工作,即使它是 分阶段进行,保证应用到数据库 安全地,并且不受其他连接的干扰,当它是 坚定的。

问题:

这是否意味着我可以让两个单独的 php 脚本同时运行事务而不会相互干扰?


详细说明我的意思 "干扰":

假设我们有以下内容employees table:

 __________________________
|  id  |  name  |  salary  |
|------+--------+----------|
|  1   |  ana   |   10000  |
|------+--------+----------|

如果我有两个具有相似/相同代码的脚本并且它们在完全相同的时间运行:

脚本1.php and 脚本2.php(两者具有相同的代码):

$conn->beginTransaction();

$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$salary = $row['salary'];
$salary = $salary + 1000;//increasing salary

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit(); 

并假设事件顺序如下:

  • 脚本1.php选择数据

  • 脚本2.php选择数据

  • 脚本1.php更新数据

  • 脚本2.php更新数据

  • 脚本1.phpcommit() 发生

  • 脚本2.phpcommit() 发生

在这种情况下,ana 的工资是多少?

  • 会是11000吗?这是否意味着一个事务将与另一个事务重叠,因为信息是在任一提交发生之前获得的?

  • 会是12000吗?这是否意味着无论数据更新和选择的顺序如何,commit()函数迫使这些单独发生?

请随意详细说明事务和单独的脚本如何相互干扰(或不干扰)。


您不会在 php 文档中找到答案,因为这与 php 或 pdo 无关。

mysql中的Innodb表引擎提供了4种所谓的隔离级别 http://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html符合sql标准。隔离级别与阻塞/非阻塞读取相结合将决定上述示例的结果。您需要了解各种隔离级别的含义,并根据您的需求选择合适的隔离级别。

总结一下:如果您使用可串行化隔离级别并关闭自动提交,则结果将为 12000。在所有其他隔离级别和可串行化且启用自动提交的情况下,结果将为 11000。如果您开始使用锁定读取,则结果可能为所有隔离级别下均为 12000。

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

了解 pdo mysql 事务 的相关文章

  • 使用 chr + rand 生成随机字符 (A-Z)

    我使用以下命令生成 A Z 的随机字符 但它偶尔会生成 符号 知道如何防止这种情况吗 也许字符范围不正确 letter chr 64 rand 0 26 用这个就更方便了 大写 letter chr rand 65 90 小写 letter
  • 使用服务帐户插入 Google 日历条目

    我正在尝试使用服务帐户在 Google 日历上创建条目 我真的很接近这一点 但最后一行行不通 我得到一个500 Internal Service Error当我让它运行时 否则 程序运行时不会出错 无论其价值如何 The Calendar
  • 通过 PHP CURL 添加 Google 联系人

    我已经成功地通过 Zend Framework 和 PHP 将联系人添加到 google 我也希望能够通过 CURL 来做到这一点 有人有关于如何执行此操作的良好教程吗 我终于能够通过 CURL 和访问令牌来做到这一点 首先 我要说的是OA
  • 如何在 Laravel 5.3 中进行自定义身份验证

    我在 Laravel 5 3 自定义身份验证中遇到问题 希望在检查时使用我自己的函数或页面Auth check 它返回false 这是用户控制器 namespace App Http Controllers use App User use
  • 如何解码这个 JSON 字符串?

    这是我从 feed finder url 中得到的字符串 JSON 编码 updated 1265787927 id http www google com reader api 0 feed finder q u003dhttp itca
  • drupal 7 将实际内容存储在数据库中的哪里?

    我打开了 drupal 7 的数据库并在表中查找node node revisions and node types并且找不到 drupal 存储实际的位置body节点 内容 的 有人有线索吗 哦 我刚刚找到了 在 D7 中 他们实现了字段
  • AJAX VS PHP 动态网页?

    当您只能使用 php 来实现动态网页时 为什么要使用 AJAX 呢 使用 AJAX 的主要原因是用户体验 UX 现在 AJAX 不一定会改善每个实例的用户体验 所以在很多地方坚持使用纯 PHP 完全没问题 但想象一下这样的情况 网站上有一个
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • CodeIgniter 控制器构造函数

    我对 codeigniter 很陌生 我想知道控制器中构造函数的含义是什么 我在 codeigniter 教程中看到以下代码 class upload extends CI Controller function construct par
  • PHP $_SERVER['REMOTE_HOST'] 返回 ::1 [重复]

    这个问题在这里已经有答案了 可能的重复 应该 ip SERVER REMOTE ADDR 在 mamp 本地主机上返回 1 https stackoverflow com questions 3699454 should ip server
  • 在脚本中使用未定义常量

    我搜索了该网站并看到了对用户应该在变量周围加上单引号的问题的修复 但我仍然有点困惑 错误 全部参考第28行 注意 使用未定义的常量 log id 假定为 log id 注意 使用未定义的常量 log username 假定为 log use
  • 在同一服务器上的 2 个子域中安装 2 个 WordPress 时共享用户

    我有 2 个 WordPress 网站 位于 2 个不同的子域中 例如test1 abc com and test2 abc com 这两个网站都激活了 wp require 插件 只有登录用户才能看到该网站 我们想要创建一个系统 如果用户
  • Laravel 5:在控制台内核的 Schedule() 函数中使用 Cache:: 或 DB::

    我正在尝试以不同的用户配置的时间间隔在 Laravel 5 中运行 Artisan 控制台命令 我已经构建了控制台命令 并拥有一个包含 运行频率 配置值的数据库 具有 Eloquent 模型 内schedule 的函数App Console
  • 我可以在 php 中的 SESSION 数组上使用 array_push 吗?

    我有一个想要在多个页面上使用的数组 因此我将其设为 SESSION 数组 我想添加一系列名称 然后在另一个页面上 我希望能够使用 foreach 循环来回显该数组中的所有名称 这是会议 SESSION names 我想使用 array pu
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • CodeIgniter加入选择为

    我的数据库中有 2 个表需要加入 一张表是 artikelen 表 另一张表是 Collections 表 我目前有 this gt db gt select this gt db gt from collecties this gt db
  • 将sql查询结果写入mysql中的文件

    我正在尝试使用 mysql 将查询结果写入文件 我在一些地方看到了有关 outfile 构造的一些信息 但似乎这只将文件写入正在运行 MySQL 的机器 在本例中是远程机器 即数据库不在我的本地机器上 或者 我还尝试运行查询并从 mysql
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • DBX 错误:驱动程序无法正确初始化

    我在跑步德尔福XE3 终极版 MySQL 数据库 这是我点击时收到的错误Test Connection 作为回应 我在 xampp 目录中找到了 libmysql 库 并将其复制到我的 System32 目录中 但这是行不通的 此消息指的是
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 为什么它不将更改从 datagridview 保存到数据表中?

    我已经绑定了datagridview with datatable Growns 我的主要目标是 用户可以使用datagridview 数据网格视图1 填充和更新数据以及何时button SAVE单击后 所有数据将保存到数据表中 因为我需要
  • 我正在寻找一个使用 MS Visual C++ Express 的 C++ 简单套接字接口

    C 中是否有一个简单的套接字接口可以与 MS Visual Studio Express Edition 一起使用 我知道有 WinSock 库 我想我正在寻找一个更易于使用的包装器 我认为 java net 库足够简单 但是 我必须使用
  • Apache 2.4 - 删除 |删除|卸载

    我在网上搜索了很长一段时间 但找不到如何完全地删除阿帕奇 2 4 Using Windows 7的c apache24 我已经尝试了所有命令 但没有任何效果 httpd k shutdown httpd k stop httpd k uni
  • 无法找到用于设置首选项 Eclipse 的 Android SDK 位置

    为了开始 Android 开发 我安装了 JDK 7 下载并安装 EclipseE 在 Windows 7 上驱动 然后按照步骤进行 使用Eclipse安装Android ADT 到目前为止一切都很好 但在尝试设置首选项时它不接受任何文件夹
  • 具有绝对位置的引导工具提示

    当使用 Bootstrap 工具提示绝对定位元素时 我遇到了奇怪的问题 工具提示未根据父元素正确呈现 请参阅小提琴 http jsfiddle net QsYPv 152 1 当父元素没有绝对定位时 一切都工作正常 有什么想法如何解决这个问
  • Stripe - 付款意图(3d 安全问题)

    我确实在我的网站上实现了付款意图 现在与此测试卡完美配合4242 4242 4242 4242 但对于其他需要 3d 安全方法的卡 我采取此错误 Invalid PaymentIntent status 我使用的代码与存在的标准代码相同St
  • WCF 的开源替代品 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 中是否有更优雅的处理列表的方法? (Python VS Java)

    我确实喜欢在 Python 中处理列表的方式 它使任何递归解决方案看起来简单干净 例如 在 Python 中获取列表中元素的所有排列的典型问题如下所示 def permutation recursion numbers sol if not
  • 带有 @FocusState 和焦点更改处理的 SwiftUI 列表

    我想用一个List FocusState跟踪焦点 以及 onChanged of focus 确保当前聚焦的字段可见ScrollViewReader 问题是 当一切都设置在一起时List在滚动过程中不断重建 使得滚动不那么平滑 我发现Lis
  • 如何在 Kotlin 中从枚举创建编译时常量?

    我有一个注释需要defaultValue为编译时常数 我拿defaultValue from enum below enum class RaceType MARATHON SPRINT companion object fun apply
  • 鼠标悬停时反应改变反应图标颜色

    当我用鼠标悬停在反应图标上时 我想更改反应图标的颜色 使用下面给出的代码 只有当鼠标悬停在图标的线条上时 图标才会改变颜色 例如 对于邮件图标 只有当光标悬停在图标的线条上而不是空白处时 颜色才会改变 如果我将鼠标悬停在图标的任何部分上 如
  • 接口“递归”和引用计数

    我的接口有一个小问题 这是伪代码 type Interface1 interface end Interface2 interface end TParentClass class TInterfacedObject Interface1
  • Discord.NET 将消息发送到一台特定服务器中的一个特定通道

    所以我试图向特定频道发送消息 但我一直在寻找并发现我看不到任何可以做到这一点的方法 我可能做错了什么 或者我在错误的区域寻找 我在谷歌上查找过 但找不到答案 这是我试图找到它时的代码 discord GetGuild serverid Ge
  • 如何将图像设置为图表轴或沿图表轴设置?

    我正在尝试使用彩色光谱带作为图表的轴 这个想法是将图像上的颜色与其沿底部 x 轴相关的波长相匹配 条带需要更改大小以匹配图表区域的变化 并扩展和收缩部分以匹配图表区域中的滚动缩放 我尝试过使用图像注释 但随着图表区域的变化 注释尺寸保持固定
  • 快速更改 SSIS 包数据源参数以方便迁移

    我需要将 SQL 数据库从 Sybase 迁移到 MS SQL Server 在生产服务器上进行实际迁移之前 我首先使用 SQL Server Management Studio 的导入 导出向导创建了一个 SSIS 包 以便与其他数据库进
  • 如何计算 python 中我的列中的行的编辑比/距离?

    我有一个只有一列的数据框 该列中有 1000 行 我需要比较所有行并找到所有行的编辑距离 我如何计算Python中的比率或距离 我有一个数据框如下 Df StepDescription click confirm button when d
  • 在 django admin 中动态设置 readonly_fields

    我可以改变吗readonly fields in my TranslationAdmin类依赖于某个字段的值Translation被查看 如果是这样 我该怎么做 我唯一想到的就是制作一个小部件来查看Translation并决定是否成为只读小
  • 使用 StreamWriter 写入 MemoryStream 返回空

    我不确定我做错了什么 看过很多例子 但似乎无法让它发挥作用 public static Stream Foo var memStream new MemoryStream var streamWriter new StreamWriter
  • 删除cassandra中大型数据集的列

    我们有一个冗余列 希望从 Cassandra 数据库 版本 2 1 15 中删除 这是一个文本列 代表磁盘上的大部分数据 15 个节点 X 每个节点 1 8 TB 最简单的选择似乎是更改表来删除该列 然后让 Cassandra 压缩来处理事
  • 了解 pdo mysql 事务

    The PHP 文档 http php net manual en pdo transactions php says 如果您以前从未遇到过交易 他们提供 4 种主要的交易方式 特点 原子性 一致性 隔离性和持久性 ACID 在 通俗地说