我想使用SELECT从InnoDB表中读取,然后在一个原子操作中使用TRUNCATE截断它,以便其他查询必须等待TRUNCATE操作完成才能修改表。最好的方法是什么?据我了解,只有隔离级别为SERIALIZABLE,事务才是原子的,并且表锁不允许TRUNCATE操作,因此必须以另一种方式实现原子性。
我正在使用PHP和MySQLi。默认隔离级别是可重复读取,因此我将其更改为SERIALIZABLE以使事务原子化:
$mysqli->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE");
$mysqli->being_transaction();
// Select statements reading from `my_table`
$mysqli->query("TRUNCATE `my_table`");
$mysqli->commit();