【发布时间】:2013-10-09 17:47:58
【问题描述】:
我已经阅读了很多关于 mysql 和事务的文档,据我了解,当我在 MySQL InnoDB 中使用可重复读取隔离级别并启动事务时,我添加了一些行,当我对这些行进行选择时MySQL 在该事务中看不到它们的行。例如:
function dotransaction() {
$result = mysqli_query("START TRANSACTION");
if (!$result) return false;
$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (1,2)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (3,4)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
$result = mysqli_query("UPDATE t2 SET f3=(SELECT COUNT(*) AS count FROM t WHERE f1=1) WHERE f4=2");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
}
如果我在 PHP 中执行以下代码,它确实将表 t2 中的字段 f3 更新为 1。但我没想到,因为当我启动事务时,事务从数据库中读取快照,无论我在哪里使用 select 语句,它都使用第一个读取快照,而不是对表的修改。当我从 UPDATE 语句中取出 select 语句时,它也会遇到 count=1。
【问题讨论】:
-
您应该使用
mysqli::begin_transaction()&mysqli::rollback()而不是查询相关的SQL。确保mysqli::autocommit处于关闭状态。 -
我为什么要使用那个?
标签: php mysql transactions isolation-level