在phpMyAdmin

时间:2015-05-30 18:07:34

标签: mysql phpmyadmin innodb

我不确定这是phpMyAdmin的问题,还是我不完全了解交易的工作方式,但我希望能够在交易中逐步完成一系列查询,并且根据返回的结果,ROLLBACKCOMMIT。我正在使用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中隐式结束事务;

  1. 断开客户端会话将隐式结束当前会话 交易。更改将被回滚。
  2. 杀死客户端会话将隐式结束当前 交易。更改将被回滚。
  3. 在Go被点击并提交查询后,phpMyAdmin是否有可能结束客户端会话?

    编辑2:

    为了确认这只是一个特定于phpMyAdmin的问题,我在MySQL Workbench中的多个单独查询中运行相同的查询,并且它完全按照预期工作,保留了事务,因此它似乎是phpMyAdmin&#39上的失败部分。

1 个答案:

答案 0 :(得分:2)

  

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

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

有一个名为persistent connections的功能,但这也是清理干净的功能。否则,代码必须以某种方式处理给同一用户提供相同的连接。鉴于PHP的工作方式,这可能会非常困难。