我已经使用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);
Edit:我了解使用 ROLLBACK 和所有......但我认为事务的全部目的是这样,如果事务中的任何查询有任何问题,那么它们都不会被执行......或者这个例如,仅在一个查询中有多个插入的情况......如果其中一个插入出现问题,那么不会插入任何插入?
如果问题类似于“此插入违反了唯一键",提交将会发生。您必须检查自己查询是否返回错误,如果是,ROLLBACK
.
例如,如果问题是服务器意外关闭,则查询 1 和 2 将不会发生。
当然,由于这里的 3 个查询是相同的,所以这是一个愚蠢的例子。至少改变一下lid
查看。你为什么不做一个快速测试呢?
编辑:您编辑了有关交易目的的问题。
交易的目的确实是保持数据库处于一致状态(阅读ACID http://en.wikipedia.org/wiki/ACID),但是由程序员决定什么是一致的。看着Prodigitalson的回答 https://stackoverflow.com/a/4819056/327563查看可能为您执行此操作的 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)