【问题标题】:Performing a transaction across multiple statements in phpMyAdmin在 phpMyAdmin 中跨多个语句执行事务
【发布时间】:2015-05-30 18:07:33
【问题描述】:

我不确定这是否是 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. 终止客户端会话将隐式结束当前 交易。更改将被回滚。

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

编辑 2:

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

【问题讨论】:

  • 您是否在 phpMyAdmin 的单独请求中执行查询?

标签: mysql phpmyadmin innodb


【解决方案1】:

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

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

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

【讨论】:

  • 啊,我明白了。所以这更像是一个 PHP 问题,而不是特定于 IDE 的问题。这可以解释为什么它似乎只影响 phpMyAdmin。我不认为 phpMyAdmin 会在运行查询后关闭每个连接,但是当您考虑它所构建的语言时,这是有道理的。我认为这回答了我的问题。
  • 这不是 PHP 的错; “无状态”是 Web 服务器的基本设计。由于 PHP(和 phpmyadmin)在那个无状态环境中运行,它们无法记住任何东西。 (好吧,$_SESSION 可能是一种解决方法,但不是一个好方法。)
  • phpmyadmin 是一个方便的工具。但是您确实需要一种真正的编程语言来进行事务处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多