Ну, предположим, у нас есть несколько пользователей.Как работают транзакции MySQLi?
Выполняется каждый сеанс работы mysqli_connect
. Таким образом, каждый пользователь имеет свое (?) Соединение с БД.
Один из пользователей активировал действие, в котором должен выполняться атомный запрос к БД. PHP предлагает сделать что-то вроде
$db = mysqli_connect(DB_HOST, DB_USER, DB_PASS);
/* ATOMIC_BEGIN */
mysqli_autocommit($db, false);
mysqli_query($db, "BLAH1");
mysqli_query($db, "BLAH2");
mysqli_commit($db);
mysqli_autocommit($db, true);
/* ATOMIC_END */
mysqli_close($db);
Хорошо, это кажется довольно простым. Тем не менее,
Чтобы определить текущее состояние AUTOCOMMIT использовать команду SQL SELECT @@ Autocommit.
Способ определения autocommit mode
- это команда SQL. Похоже, что mysqli_autocommit
применяется не к подключению для конкретного пользователя, а к всему состоянию БД. И, таким образом, сделка может быть как ниже
$db = mysqli_connect(DB_HOST, DB_USER, DB_PASS);
// This one is on the another thread or whatever
// Runned by another user
$db2 = mysqli_connect(DB_HOST, DB_USER, DB_PASS);
/* ATOMIC_BEGIN */
mysqli_autocommit($db, false);
mysqli_query($db, "BLAH1");
// This one is on the another thread or whatever
// Runned by another user
// Not autocommitted since we turned it off
// Can be rolled back
mysqli_query($db2, "QUERY FOR THE ANOTHER USER WHICH BREAKS OUR ATOMICITY AND RESULTS OF THE BLAH2 (E. G. LOGIN)");
mysqli_query($db, "BLAH2");
// Commits both $db and $db2 queries
mysqli_commit($db);
mysqli_autocommit($db, true);
/* ATOMIC_END */
mysqli_close($db);
Что является ошибочным и совершенно бессмысленно: другие пользователи будут Вход/регистрация только после mysqli_commit
действия.
Я хотел бы знать правильный способ изолировать атомные транзакции между пользователями или ошибку, которую я сделал в своих мыслях. Моя цель - $db2
запрос, который будет выполнен после раздела ATOMIC
.
Спасибо за ответ, подумал так же. Метод проверки текущего состояния автокоммутации полностью сбил мои мысли ... – efpies