【问题标题】:How exactly do transactions with PHP PDO work with concurrency?使用 PHP PDO 的事务究竟如何与并发一起工作?
【发布时间】:2012-06-21 06:29:20
【问题描述】:

我正在制作一个 web 应用程序,他们将是多个用户相互交互并阅读/做出决定/修改共享数据。

我读到事务是原子的,这正是我所需要的。但是,我不确定它如何与 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 mysql transactions pdo acid


【解决方案1】:

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

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

【讨论】:

  • 嗯。但是,当我处于事务中间时,其他事务可以读取数据吗?因为如果我处于事务中间并且有人正在读取旧值,这通常会违背正确并发的目的。对不起,如果我没有让你正确
  • 我以前见过它们,但希望我能只用交易就逃脱哈哈。我再次查看了select for update,但似乎无法确定锁定何时释放。下次更新后?事务何时/之后提交?
  • 直接从参考文档复制:All locks set by LOCK IN SHARE MODE and FOR UPDATE queries are released when the transaction is committed or rolled back.
  • 亲爱的。对这些琐碎的问题感到抱歉。无论如何,谢谢!回答了我所有的问题
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 2021-04-16
  • 2016-02-11
  • 2020-08-09
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多