Я хочу прочитать из таблицы InnoDB, используя SELECT, а затем обрезать ее, используя TRUNCATE, за одну операцию, так что другие запросы должны ждать завершения операции TRUNCATE, прежде чем они смогут изменить таблицу. Каков наилучший способ сделать это? Насколько я понимаю, блокировки таблиц не работают с TRUNCATE. Но из моих тестов транзакции do работают с TRUNCATE. Однако транзакции гарантированно не перекрываются, если уровень изоляции SERIALIZABLE.
Я использую PHP и MySQLi. Уровень изоляции по умолчанию - REPEATABLE READ, поэтому я изменяю его на SERIALIZABLE, чтобы предотвратить одновременное изменение таблицы при запросах до завершения транзакции:
$mysqli->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE");
$mysqli->begin_transaction();
// Select statements reading from `my_table`
$mysqli->query("TRUNCATE `my_table`");
$mysqli->commit();
Кажется, это работает просто отлично. Мне просто интересно, есть ли лучший способ.