我想尝试交易以及它们如何实际运作。所以我决定编写两个脚本来测试交易的主要功能(处理同时访问数据库)InnoDB交易 - 不起作用
我已经在stackoverflow上问了一个问题,下面是该问题的编辑。但我再次阅读规则,并认为将其发布在我原来的问题下可能是错误的,因为它有些不同。那么请问这个在一个新的问题:
我的代码(和数据库表设置为InnoDB的):
在page1.php中:
$db->query("START TRANSACTION;");
$db->query("SET AUTOCOMMIT = 0;");
try {
$i = 0;
while ($i <= 120000000) {
$i++;
}
var_dump($db->query("INSERT INTO test VALUES (NULL, 'testvalue')"));
$db->query("COMMIT;");
}
catch (Exception $e) {
$db->query("ROLLBACK;");
echo $e->getMessage();
}
- 方法工作的query
。它只是查询字符串。而while
环路只为我。我需要一点时间去其他浏览器选项卡中加载使page2.php:
$db->query("START TRANSACTION;");
$db->query("SET AUTOCOMMIT = 0;");
try {
// outputs an array with the data
var_dump($db->query("SELECT * FROM test", "assoc"));
$db->query("COMMIT;");
}
catch (Exception $e) {
$db->query("ROLLBACK");
echo $e->getMessage();
}
随着SELECT
我得到了所有的数据库表中的值,这是在第一个空的数组。
现在我打开page1.php,它将在database
中插入新数据。但首先它通过循环,大约需要3-4秒。同时,我打开了page2.php
。
从我的理解,page2.php应该等待page1.php来完成其transaction
?但它只是像平常一样加载并输出一个空数组。
当我在page1.php完成加载后刷新page2.php
时,我得到了新数据的正确输出。
我的错误在哪里?我不太明白。
编辑:这是另外一个我想:
page1.php中
$db->query("SET AUTOCOMMIT = 0;");
$db->query("START TRANSACTION;");
try {
//print_r($db->query("DELETE FROM test;", "affected"));
$i = 200;
while ($i <= 700) {
var_dump($db->query("INSERT INTO test VALUES ({$i}, 'testvaluetestvaluetestvaluetestvaluetestvalue')"));
$i++;
}
$db->query("COMMIT;");
}
catch (Exception $e) {
$db->query("ROLLBACK;");
echo $e->getMessage();
}
使page2.php
$db->query("SET AUTOCOMMIT = 0;");
$db->query("START TRANSACTION;");
try {
var_dump($db->query("SELECT * FROM test", "assoc"));
$db->query("COMMIT;");
}
catch (Exception $e) {
$db->query("ROLLBACK");
echo $e->getMessage();
}
虽然没有完成page1.php中,第2页应该输出什么都没有,但它输出第70行(取决于我重新加载的速度)
Page 2不等待第1页,否则你可能拥有一些严重的性能问题:它在请求的地方读取数据库,但应该只读取第1页未修改的数据....即,数据库在第1页插入/更新/删除 –
[ACID](http://en.wikipedia.org/wiki/ACID)可能会给你一些关于什么交易都是关于 –
的想法哦,好吧。但我也尝试了另一件事。在第1页上我将500行插入到数据库中,这需要几秒钟的时间。同时,我打开第2页,它确实输出了前70行,这些行正在被第1页添加。但是我不明白为什么。由于'autocommit'被禁用,所以它应该(如你所说)在所有查询完成后才应用这些插入。也许我在我的问题中发布了这段代码。也许有一个错误。 – Quantm