Ответ 1
Чтобы ответить на ваш первый вопрос...
При использовании транзакций ваши запросы выполняются в обычном порядке в отношении вашего подключения. Вы можете выбрать фиксацию, сохранение этих изменений или откат, возвращая все изменения. Рассмотрим следующий псевдокод:
insert into number(Random_number) values (rand());
select Random_number from number where Number_id=Last_insert_id();
//PHP
if($num < 1)
$this->db->query('rollback;'); // This number is too depressing.
else
$this->db->query('commit;'); // This number is just right.
Случайное число, которое было сгенерировано, может быть прочитано до фиксации, чтобы убедиться, что оно подходит, прежде чем сохранять его для всех, чтобы увидеть (например, зафиксировать и разблокировать строку).
Если драйвер PDO не работает, попробуйте использовать драйвер mysqli. Если это не вариант, вы всегда можете использовать запрос "select last_insert_id() как id; а не функцию $this- > db- > insert_id().
Чтобы ответить на второй вопрос, если вы вставляете или обновляете данные, которые будут обновлять или считывать другие модели, обязательно используйте транзакции. Например, если столбец "Number_remaining" установлен в 1, может возникнуть следующая проблема.
Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0
Использование транзакций в той же ситуации даст следующий результат:
Лицо A начинает транзакцию
Лицо A читает "1" из Number_remaining
(строка теперь заблокирована, если используется выбрать для обновления) Лицо B попытки прочитать Number_remaining - заставили ждать
Лицо A побеждает $1000
Лицо Обновления 1, чтобы быть 0
Лицо А совершает
Лицо B читает 0
Лицо B не выигрывает $1000
Лицо B кричит
Возможно, вам захочется прочитать на уровни изоляции транзакций.
Будьте осторожны с тупиком, который может произойти в этом случае:
Лицо A читает строку 1 (
select ... for update
)
Лицо B читает строку 2 (select ... for update
)
Лицо A пытается прочитать строку 2, заставил ждать
Person B пытается прочитать строку 1, заставил ждать
Лицо A достигает innodb_lock_wait_timeout (по умолчанию 50 секунд) и отключен
Person B читает строку 1 и продолжает нормально
В конце концов, поскольку Person B, вероятно, достиг PHP max_execution_time
, текущий запрос завершит выполнение независимо от PHP, но дальнейшие запросы не будут получены. Если это была транзакция с autocommit = 0, запрос автоматически откатится, когда соединение с вашим сервером PHP будет разорвано.