【发布时间】:2015-05-30 18:07:33
【问题描述】:
我不确定这是否是 phpMyAdmin 的问题,或者我不完全了解事务的工作原理,但我希望能够在事务中逐步完成一系列查询,或者 ROLLBACK或COMMIT 基于返回的结果。我正在使用 InnoDB 存储引擎。
这是一个基本的例子;
START TRANSACTION;
UPDATE students
SET lastname = "jones"
WHERE studentid = 1;
SELECT * FROM students;
ROLLBACK;
作为单个查询,这完全可以正常工作,如果我对结果感到满意,我可以使用 COMMIT 重新运行整个查询。
但是,如果所有这些查询都可以单独运行,为什么 phpMyAdmin 会丢失事务?
例如,如果我这样做;
START TRANSACTION;
UPDATE students
SET lastname = "jones"
WHERE studentid = 1;
SELECT * FROM students;
然后这个;
COMMIT;
SELECT * FROM students;
我在事务中所做的更新丢失了,lastname 保持其原始值,就好像从未发生过更新一样。我的印象是事务可以跨越多个查询,我见过几个这样的例子;
1:在 Navicat 中完全可能,不同的 IDE
2:也可以通过 MySQLi 在PHP 中实现
如果事务能够跨越多个单独的查询,为什么我会丢失 phpMyAdmin 中的事务?
编辑1:经过一番挖掘,似乎还有另外两种方式可以在MySQL中隐式结束事务;
- 断开客户端会话将隐式结束当前 交易。更改将被回滚。
- 终止客户端会话将隐式结束当前 交易。更改将被回滚。
phpMyAdmin 是否有可能在 Go 被命中并提交查询后结束客户端会话?
编辑 2:
为了确认这只是一个特定于 phpMyAdmin 的问题,我在 MySQL Workbench 中的多个单独查询中运行了相同的查询,并且它完全按照预期工作,保留了事务,所以它似乎是 phpMyAdmin 的一部分。
【问题讨论】:
-
您是否在 phpMyAdmin 的单独请求中执行查询?
标签: mysql phpmyadmin innodb