究竟如何使用PHP PDO交易并发工作?(How exactly do transactions w

2019-09-18 08:10发布

我在做一个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();

Answer 1:

事务是原子仅相对于试图使用相同的数据,即其他连接会看到其他的数据库连接或者没有通过您的交易,或所有更改所做的更改; “原子”意味着没有其他的数据库连接,将看到一个与中间状态的一些数据更新和其他不。

查询之间的PHP代码不会打破原子,并不要紧,你准备好你的语句。



文章来源: How exactly do transactions with PHP PDO work with concurrency?