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

Rae*_*kye 1 php mysql pdo transactions acid

我正在制作一个webapp,他们将是多个用户互相交流,阅读/制定/修改共享数据的决策.

我已经读过交易是原子的,这就是我需要的.但是,我不确定它如何与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();
Run Code Online (Sandbox Code Playgroud)

lan*_*nzz 9

对于尝试使用相同数据的其他数据库连接,事务仅是原子的,即其他连接将看到您的事务没有进行任何更改,或者所有更改; "atomic"意味着没有其他数据库连接会看到中间状态,其中一些数据已更新而其他数据未更新.

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