2013-11-19 3 views
0

Ну, предположим, у нас есть несколько пользователей.Как работают транзакции 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.

ответ

2

mysqli_autocommit влияет только на текущий $link, он не должен мешать другим соединениям/потокам.

Вещь, которую вы называете $db, на самом деле является Ресурсом связи MySQLi.

+0

Спасибо за ответ, подумал так же. Метод проверки текущего состояния автокоммутации полностью сбил мои мысли ... – efpies

Смежные вопросы