Php Mysql事务未按预期工作

Php Mysql事务未按预期工作,php,mysql,transactions,isolation-level,Php,Mysql,Transactions,Isolation Level,我已经阅读了很多关于mysql和事务的文档,从中我了解到,当我在mysql InnoDB中使用repeatable read isolation level时,我启动了一个事务,并添加了一些行,当我对这些行进行选择时,mysql在该事务中看不到这些行。例如: function dotransaction() { $result = mysqli_query("START TRANSACTION"); if (!$result) return false; $result = mys

我已经阅读了很多关于mysql和事务的文档,从中我了解到,当我在mysql InnoDB中使用repeatable read isolation level时,我启动了一个事务,并添加了一些行,当我对这些行进行选择时,mysql在该事务中看不到这些行。例如:

function dotransaction() {
  $result = mysqli_query("START TRANSACTION");
  if (!$result) return false;

  $result = mysqli_query("INSERT INTO t (f1,f2) VALUES (1,2)");
  if (!$result) {
    mysqli_query("ROLLBACK");
    return false;
  }

  $result = mysqli_query("INSERT INTO t (f1,f2) VALUES (3,4)");
  if (!$result) {
    mysqli_query("ROLLBACK");
    return false;
  }

  $result = mysqli_query("UPDATE t2 SET f3=(SELECT COUNT(*) AS count FROM t WHERE f1=1) WHERE f4=2");
  if (!$result) {
    mysqli_query("ROLLBACK");
    return false;
  }
}
如果我在PHP中执行以下代码,它会将表t2中的字段f3更新为1。但我没有料到这一点,因为当我启动事务时,事务从数据库中读取快照,无论我在哪里使用select语句,它都使用第一个读取的快照,而不是对表的修改。当我从UPDATE语句中取出select语句时,它也会导致met count=1。

您理解错误

在事务中对数据所做的更改在该事务中可见,因此SELECT语句将看到更新的行

但是,这些更改在事务外部是不可见的,因此如果其他用户同时连接到服务器并查询这些行,他将看到它们处于未更改的状态。

您理解错误

在事务中对数据所做的更改在该事务中可见,因此SELECT语句将看到更新的行


但是,这些更改在事务外部是不可见的,因此如果另一个用户同时连接到服务器并查询这些行,他将看到它们处于未更改的状态。

您应该使用
mysqli::begin_transaction()
&
mysqli::rollback()
,而不是查询相关的SQL。确保
mysqli::autocommit
处于禁用状态。我为什么要使用该选项?您应该使用
mysqli::begin\u transaction()
&
mysqli::rollback()
,而不是查询相关SQL。确保
mysqli::autocommit
已关闭。我为什么要使用该选项?好的,谢谢,在其他地方找不到示例。这些示例表明,当我使用SELECT时。。对于更新,我可以看到插入的行。
SELECT FOR UPDATE
有不同的用途。它锁定所选行,以便其他事务无法修改它们。请参阅,但当我在事务中执行更新时,是否必须首先使用SELECT。。。在我可以保存更新行之前进行更新?不,您不必这样做。如果其他事务在事务结束前更改了这些行,您将无法提交。如果您需要将您的事务优先于其他事务,请锁定行。好的,谢谢,在其他地方找不到示例。这些示例表明,当我使用SELECT时。。对于更新,我可以看到插入的行。
SELECT FOR UPDATE
有不同的用途。它锁定所选行,以便其他事务无法修改它们。请参阅,但当我在事务中执行更新时,是否必须首先使用SELECT。。。在我可以保存更新行之前进行更新?不,您不必这样做。如果其他事务在事务结束前更改了这些行,您将无法提交。如果需要为事务赋予优先权,请锁定行。