Я улучшаю веб-приложение, созданное в Codeigniter, чтобы контролировать, сколько людей могут одновременно сохранить строку.
Поскольку Codeigniter не включает в себя обычные функции «Для обновления» или «Режим блокировки в общем доступе», я выполнил ряд пользовательских запросов и получил «Для обновления».
Проблема в том, что строки заблокированы, но только на короткий промежуток времени (10 секунд), хотя я установил для сеанса более длительное время ожидания, я даже установил глобальное время ожидания и транзакция по-прежнему прерывается в течение 10-15 секунд.
Если я реализую функцию сна для тестирования, строки блокируются должным образом, как бы долго я не переводил транзакцию в режим ожидания.
Если я использую MySQL Workbench, время ожидания работает как положено.
$this->db->query('SET SESSION autocommit = 0');
$this->db->query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$this->db->query('SET SESSION innodb_lock_wait_timeout = 1');
$this->db->query('SET SESSION interactive_timeout = 28000');
$this->db->query('SET SESSION wait_timeout = 28000');
$this->db->trans_start();
$query = //Query is here
$data = $this->db->query("{$sql} FOR UPDATE;")->row();
return $data;