php - MySQL InnoDB - 对事务感到困惑

标签 php mysql transactions innodb

我已经使用 MySQL 多年,但没有太多使用 InnoDB 引擎的经验。

我现在正在对它进行一些测试,因为我将要使用它,并且从我读过的内容来看,如果其中的任何查询有任何问题,它不应该允许任何东西“通过”那笔交易。

我的问题是,为什么在下面的代码中......当第三个查询明显有问题时,它是否仍然将前两个查询输入到数据库中?

$query = "BEGIN";
mysql_query($query);

$query = "INSERT INTO list_columns(lid,column_name) VALUES(8,'test')";
mysql_query($query);

$query = "INSERT INTO list_columns(lid,column_name) VALUES(8,'test')";
mysql_query($query);

$query = "INSERT INT list_columns(lid,column_name) VALUES(8,'test')";
mysql_query($query);

$query = "COMMIT";
mysql_query($query);

编辑:我了解使用 ROLLBACK 和所有......但我认为交易的全部目的是为了如果交易中的任何查询有任何问题那么它们中的任何一个都不会被执行……或者这只是在一个查询中有多个插入的情况……例如,如果其中一个插入出现问题,那么将不会插入任何插入?

最佳答案

如果问题类似于“此插入违反了唯一键”,则会进行提交。您必须自己检查查询是否返回错误,如果是,则ROLLBACK

如果问题是服务器意外关闭,查询 1 和 2 将不会发生。

Offcourse,因为这里的 3 个查询是相同的,所以这是一个愚蠢的例子。至少改变 lid 看看。你为什么不做一个快速测试?

编辑:您编辑了有关交易目的的问题。

事务的目的确实是让数据库保持一致状态(阅读 ACID ),但由程序员决定什么是一致的。看prodigitalson's answer查看为您执行此操作的可能的错误捕获 php 方式的示例。但是,当您处于事务中时,其他进程将看不到您的事务所做的更改 - 因此是原子的和孤立的。

CREATE TABLE `testkeys` (
  `lid` INT,
  `column_name` VARCHAR(50),
  UNIQUE KEY `testuniq` (`lid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

BEGIN;
INSERT INTO testkeys(lid,column_name) VALUES(1,'test 1');
INSERT INTO testkeys(lid,column_name) VALUES(2,'test 2');
INSERT INTO testkeys(lid,column_name) VALUES(3,'test 3');
INSERT INTO testkeys(lid,column_name) VALUES(2,'test 2b');
COMMIT;

关于php - MySQL InnoDB - 对事务感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818929/

相关文章:

php - 如何在我的网站上以更好的方式上传、播放和存储视频

带有额外检查的 MySQL upsert

sql - Liquibase 是否支持试运行?

javascript - 如何从laravel Blade循环获取jQuery的变量类名

php - 轮类日历 - 根据给定模式确定轮类

android - android 设备上 sqlite 数据库的默认位置不显示我的数据库

java - dynamoDB 事务管理器

mysql - PDO 事务提交而不是回滚

javascript - 通过 PHP 和 JQuery 提交多个数据库更新

php - MYSQL 选择超过 2 年的数据