Есть ли способ ускорить этот MySQL? - PullRequest
1 голос
/ 09 декабря 2011

Мой код,

$dbc -> beginTransaction();
$dbc -> query("LOCK TABLES items WHERE id = " . $user['id'] . " WRITE");
$q = $dbc -> prepare("UPDATE items SET shrapnel = ?, bank = ? WHERE id = ?");
$q -> execute(array($user['shrapnel'] - $_POST['deposit'], $user['bank'] + $_POST['deposit'], $user['id']));
$dbc -> query("UNLOCK TABLES items WHERE id = " . $user['id'] . "");
$dbc -> commit();

Довольно просто на самом деле, нужно убедиться, что никто другой не сможет прочитать или записать значения строки пользователя в таблице. Нужно убедиться, что он откатывается, если что-то идет не так!

Если я не произвожу отката explicity и что-то не получится, изменения не произойдут?

И является ли это верным способом убедиться в том, что, хотя это утверждение зафиксировано, что другие пользователи не смогут прочитать или обновить эти значения, чтобы избежать полной катастрофы?

Я использую InnoDB, который поддерживает блокировку на уровне строк.

1 Ответ

2 голосов
/ 09 декабря 2011

Вы не можете заблокировать часть таблицы таким образом. Вы либо заблокируете стол, либо не нажмете LOCK TABLES

Чтобы заблокировать определенные строки для записи, добавьте FOR UPDATE к вашему SELECT следующим образом:

$dbc -> query("SELECT * FROM items WHERE id = " . $user['id'] . " FOR UPDATE");

И не выполняйте UNLOCK TABLES, просто зафиксируйте или откатите транзакцию, и блокировки будут сняты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...