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