【发布时间】:2012-12-24 05:50:03
【问题描述】:
我想暂时锁定一个表以防止其他并发进程对其进行更改。这样做的原因是这个表将被复制到一个临时表,改变,然后复制回来(原来的实际上被删除了,新的表被重命名了)。然后在这一切都完成之后,我想解锁表,并希望在锁定恢复期间尝试过任何事情。
我还需要能够从已锁定的表中读取数据以构建新表。
这是我尝试过的,但它似乎不起作用。
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);
$mysqli->autocommit(false)
// create a table to hold parts to keep
$q1 = "CREATE TABLE new_table LIKE my_table;";
$res1 = $mysqli ->query($q1);
// Lock table to avoid concurrent update issues
$q2 = "LOCK TABLE my_table WRITE;";
$res2 = $mysqli ->query($q2);
// Insert data to keep into new table
$q3 = "INSERT INTO new_table SELECT * FROM my_table WHERE some_id IN (SELECT ID FROM table2)";
$res3 = $mysqli ->query($q3);
// drop original table
$q4 = "DROP TABLE my_table;";
$res4 = $mysqli ->query($q4);
// rename new table
$q5 = "RENAME TABLE new_table TO my_table;";
$res5 = $mysqli ->query($q5);
$mysqli ->commit(); // commit changes and re-enable autocommit
$q = "UNLOCK TABLES;";
$res = $mysqli ->query($q);
为了测试,使用 PHPmyadmin,我发出了“SET AUTOCOMMIT=0; LOCK TABLE my_table WRITE;”查询,然后尝试从 my_table 中删除某些内容,我能够这样做。我想阻止这个。此外,在发出 lock 语句后,程序的其余部分将失败并且没有任何改变。
【问题讨论】:
-
“似乎不起作用”您进行了哪些调试?
-
我编辑了这个问题,让你知道什么是失败的。我只想知道锁定 INNODB 表以防止更新的正确过程。
-
这样更好。你检查权限了吗?您确定删除已立即应用而不是“排队”吗?您是否调查过关闭自动提交是否会导致问题?我从来没有发现自己必须这样做。
-
权限没问题。删除自动提交没有区别