php - PHP PDO 的事务究竟如何与并发一起工作?

标签 php mysql transactions pdo acid

我正在制作一个网络应用程序,其中将有多个用户相互交互并阅读/做出决定/修改共享数据。

我读到事务是原子的,这正是我所需要的。但是,我不确定它如何与 PHP PDO::beginTransaction()

一起使用

我的意思是原子性,如果一个事务正在编辑一些数据,所有其他事务也修改/读取该数据将需要等到第一个事务完成。就像我不希望两个脚本读取一个值,增加旧值,并有效地只存储一个增量。第二个脚本必须等待第一个脚本完成。

在我见过的几乎所有示例中,查询都是连续使用的(示例 PHP + MySQL transactions examples)。我正在做的很多事情都需要

  • 查询和获取
  • 检查该数据并对其采取行动,作为同一交易的一部分

  1. 如果查询之间有 PHP 代码,事务是否仍会自动运行?
  2. 我知道您应该在交易外准备报表,但是在交易内准备可以吗?基本上,我担心 PHP 事件会破坏事务的原子性。

这是一个例子(这个例子不需要检查以前的值)。我有一个非常基本的收件箱系统,它将邮件存储为序列化数组(如果有人有更好的建议,请告诉我)。所以我查询它,附加新消息,然后存储它。它会按预期工作吗?

$getMail = $con->prepare('SELECT messages FROM inboxes WHERE id=?');
$storeMail = $con->prepare('UPDATE inboxes SET messages=? WHERE id=?');
$con->beginTransaction();
$getMail->execute(array($recipientID));
$result = $getMail->fetch();
$result = unserialize($result[0]);
$result[] = $msg;
$storeMail->execute(array(serialize($result), $recipientID));
$con->commit();

最佳答案

事务仅对于尝试使用相同数据的其他数据库连接是原子的,即其他连接将看到您的事务所做的没有更改,或者所有更改; “原子”意味着没有其他数据库连接会看到一些数据更新而其他数据不更新的中间状态。

查询之间的 PHP 代码不会破坏原子性,无论您在哪里准备语句都没有关系。

关于php - PHP PDO 的事务究竟如何与并发一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11132696/

相关文章:

javascript - 与内部另一个事务同步的WebSQL事务

java - 如何根据先前的选择从下拉列表中进行选择?

php - $post->comments()->create() 是否比 Laravel 中的 Comment::create() 更昂贵?

php - CSS 网格,4 个大列,3 个中等

mysql - Joomla JFactory 查询返回今天日期之后的结果

mysql - 如何将表格从 1 行多列重组为多行少列?

php - 无法在 Highcharts 中的多列 mysql 数组上显示 x 轴标签

mysql - 在 Ubuntu 上连接 mysql 时出错

交易失败的Paypal交易对象

MySql:在提交之前选择插入同一事务中的一行