#database #pdo #transactions
#База данных #pdo #транзакции
Вопрос:
Я новичок в транзакции PDO, я хочу знать, откат () — это откат базы данных или только таблиц внутри beginTransaction ().
Например :
$db->beginTransaction();
try{
$stmt = $db->prepare('SELECT * FROM user_detail .......');
$stmt -> bindParam(........);
......
$stmt -> execute();
while($s = $stmt->fetch(PDO::FETCH_ASSOC)){
$update = $db->prepare('UPDATE tableB .......');
$update -> execute();
$update = $db->prepare('UPDATE tableC .......');
$update -> execute();
$delete = $db->prepare('Delete tableD .......');
$delete -> execute();
}
$db->commit();
}
catch(PDOException $e){
$db->rollback();
}
В то же время существует другой запрос, который обновит таблицу, и таблица была отправлена, когда первый запрос (показанный выше) все еще выполняется. Будет ли новый запрос выполняться немедленно или после выполнения первого запроса.
Если оба они выполняются одновременно, что делать, если обнаружена ошибка и запускается откат (), будет ли второй запрос (update TableC и tableG) откатываться, если это сделано до начала отката?
Ответ №1:
Откат отменяет все изменения, внесенные INSERT / UPDATE / DELETE с начала транзакции.
Независимо от того, выполняете ли вы фиксацию или откат, только те изменения, которые были внесены в текущую транзакцию, а не другие изменения, происходящие в других сеансах. Они могут выполнять фиксацию или откат независимо.
Одновременные обновления, выполняемые в разных сеансах, будут выполняться одновременно, если только они не пытаются обновить одни и те же строки (даже частично перекрывающиеся наборы строк). Один или другой сеанс сначала получит доступ к этим строкам и заблокирует строки перед их обновлением. Сеанс, который получил блокировки, будет удерживать эти блокировки до тех пор, пока он не зафиксирует или не откатит свою транзакцию.
О блокировке можно узнать гораздо больше. Это очень сложная тема. Возможно, вам понравится моя презентация, в которой блокировка InnoDB объясняется с помощью фигурок, чтобы начать (но это только царапает поверхность).
Моя презентация конкретно о MySQL. Вы не сказали, какую марку СУБД вы используете. У каждого из разных брендов будут свои особенности в отношении транзакций и блокировки.