1

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

我读过事务是原子的,这是我需要的。但是,我不确定它如何与 PHP 一起使用PDO::beginTransaction()

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

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

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

  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();
4

1 回答 1

10

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

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

于 2012-06-21T06:33:37.730 回答