在 phpMyAdmin 中跨多个语句执行事务

Performing a transaction across multiple statements in phpMyAdmin

我不确定这是否是 phpMyAdmin 的问题,或者我没有完全理解 t运行sactions 的工作原理,但我希望能够逐步完成一系列查询t运行saction,以及基于返回结果的 ROLLBACKCOMMIT。我正在使用 InnoDB 存储引擎。

这是一个基本示例;

START TRANSACTION;

UPDATE students
SET lastname = "jones"
WHERE studentid = 1;

SELECT * FROM students;

ROLLBACK;

作为单个查询,这完全可以正常工作,如果我对结果满意,我可以使用 COMMIT.

重新 运行 整个查询

但是,如果所有这些查询都可以 运行 分开,为什么 phpMyAdmin 会失去 t运行saction?

例如,如果我这样做;

START TRANSACTION;

UPDATE students
SET lastname = "jones"
WHERE studentid = 1;

SELECT * FROM students;

然后这个;

COMMIT;

SELECT * FROM students;

我在 t运行 操作中所做的更新丢失了,姓氏保留其原始值,就好像更新从未发生过一样。我的印象是 t运行sactions 可以跨越多个查询,我已经看到了几个这样的例子;

1:完全有可能 Navicat,不同的 IDE

2:在 PHP 中也可以通过 MySQLi

如果 t运行saction 能够跨越多个单独的查询,为什么我会在 phpMyAdmin 中丢失 t运行saction?

编辑 1: 在进行了一些挖掘之后,似乎还有两种其他方法可以在 MySQL 中隐式结束 t运行saction ;

  1. 断开客户端会话将隐式结束当前 t运行动作。更改将被回滚。
  2. 终止客户端会话将隐式结束当前 t运行行动。将回滚更改。

在点击 Go 并提交查询后,phpMyAdmin 是否可能正在结束客户端会话?

编辑 2:

只是为了确认这只是一个特定于 phpMyAdmin 的问题,我 运行 在 MySQL Workbench 中跨多个单独的查询进行了相同的查询,并且它完全按预期工作,保留t运行saction,所以它似乎是 phpMyAdmin 的失败。

Is it possible that phpMyAdmin is ending the client session after Go is hit and a query is submitted?

这几乎就是 PHP 的工作原理。您发送请求,它会得到处理,一旦完成,所有内容(包括 MySQL 连接)都会被丢弃。下一个请求,你重新开始。

有一个名为 persistent connections 的功能,但它也可以进行清理。否则代码将不得不以某种方式处理为同一用户提供相同的连接。鉴于 PHP 的工作方式,这可能会非常困难。