在 phpMyAdmin 中跨多个语句执行事务
Performing a transaction across multiple statements in phpMyAdmin
我不确定这是否是 phpMyAdmin 的问题,或者我没有完全理解 t运行sactions 的工作原理,但我希望能够逐步完成一系列查询t运行saction,以及基于返回结果的 ROLLBACK
或 COMMIT
。我正在使用 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 ;
- 断开客户端会话将隐式结束当前
t运行动作。更改将被回滚。
- 终止客户端会话将隐式结束当前
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 的工作方式,这可能会非常困难。
我不确定这是否是 phpMyAdmin 的问题,或者我没有完全理解 t运行sactions 的工作原理,但我希望能够逐步完成一系列查询t运行saction,以及基于返回结果的 ROLLBACK
或 COMMIT
。我正在使用 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 ;
- 断开客户端会话将隐式结束当前 t运行动作。更改将被回滚。
- 终止客户端会话将隐式结束当前 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 的工作方式,这可能会非常困难。