我想临时锁定一张表,以防止其他并发进程对其进行更改。原因是这个表将被复制到一个临时表中,进行修改,然后再复制回来(实际上,原来的表会被删除,新表会被重命名)。完成所有操作后,我想解锁表格,并希望在锁定期间进行的任何尝试都能够继续。
我还需要能够从已锁定的表中读取数据,以构建新表。
以下是我尝试过的内容,但似乎并不起作用。
为了测试,我使用PHPmyadmin发出了"SET AUTOCOMMIT=0; LOCK TABLE my_table WRITE;"查询,然后尝试从my_table中删除某些内容,结果删除成功。我想阻止这种情况发生。此外,在发出锁定语句后,其余的过程会失败且不会进行任何修改。
我还需要能够从已锁定的表中读取数据,以构建新表。
以下是我尝试过的内容,但似乎并不起作用。
$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中删除某些内容,结果删除成功。我想阻止这种情况发生。此外,在发出锁定语句后,其余的过程会失败且不会进行任何修改。