我正在创建一个webapp,他们将是多个用户互相交流,阅读/修改/修改共享数据。
我已经读过交易是原子的,这就是我需要的。但是,我不确定它如何与PHP PDO::beginTransaction()
我的意思是原子,如果一个事务正在编辑某些数据,所有其他事务也修改/读取该数据将需要等到第一个事务完成。就像我不希望两个脚本读取值,递增旧脚本,并有效地只存储一个增量。第二个脚本应该等待第一个脚本完成。
在几乎所有的例子中,我都看到了连续使用的查询(例如PHP + MySQL transactions examples)。很多我正在做的事情需要
这是一个例子(这个不需要检查以前的值)。我有一个非常基本的收件箱系统,它将邮件存储为序列化数组(如果有人有更好的推荐请告诉我)。所以我查询它,附加新消息,然后存储它。它会按预期工作吗?
$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();
答案 0 :(得分:9)
仅针对尝试使用相同数据的其他数据库连接进行事务处理,即其他连接将看到您的事务所做的 no 更改,或所有更改; “atomic”意味着没有其他数据库连接会看到中间状态,其中一些数据已更新而其他数据未更新。
查询之间的PHP代码不会破坏原子性,并且在准备语句的位置无关紧要。