与PHP PDO的交易究竟如何与并发一起使用?

时间:2012-06-21 06:29:20

标签: php mysql transactions pdo acid

我正在创建一个webapp,他们将是多个用户互相交流,阅读/修改/修改共享数据。

我已经读过交易是原子的,这就是我需要的。但是,我不确定它如何与PHP PDO::beginTransaction()

一起使用

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

在几乎所有的例子中,我都看到了连续使用的查询(例如PHP + MySQL transactions examples)。很多我正在做的事情需要

  • 查询和抓取
  • 检查该数据并对其进行操作,作为同一事务的一部分

  1. 如果查询之间存在PHP代码,事务是否仍然可以原子工作?
  2. 我知道你应该在交易之外准备你的陈述,但是可以在里面准备吗?基本上,我担心PHP活动会破坏交易的原子性。
  3. 这是一个例子(这个不需要检查以前的值)。我有一个非常基本的收件箱系统,它将邮件存储为序列化数组(如果有人有更好的推荐请告诉我)。所以我查询它,附加新消息,然后存储它。它会按预期工作吗?

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

1 个答案:

答案 0 :(得分:9)

仅针对尝试使用相同数据的其他数据库连接进行事务处理,即其他连接将看到您的事务所做的 no 更改,或所有更改; “atomic”意味着没有其他数据库连接会看到中间状态,其中一些数据已更新而其他数据未更新。

查询之间的PHP代码不会破坏原子性,并且在准备语句的位置无关紧要。