2011-12-08 60 views
1

我的代碼,有沒有辦法加快這個MySQL?

$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(); 

很簡單實在,需要確保沒有其他人可以讀取或寫入到用戶的值排在表中。如果出現問題,還需要確保它回滾!

如果我不明確回滾和某些失敗,那麼更改將不會發生?

這是一個確定的方式,以確保這個聲明承諾,沒有其他用戶將能夠讀取或更新這些值,以避免一個完整的災難?

我使用支持行級鎖定的InnoDB。

回答

2

你不能像這樣鎖定一部分表。你要麼鎖定表或不LOCK TABLES

要鎖定某些行寫添加FOR UPDATESELECT這樣的:

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

不要做UNLOCK TABLES,只需提交或回滾事務和鎖將被釋放。

+0

好的,謝謝!很難找到關於此的文檔!謝謝! – cgwebprojects

+0

我發現了一個更好的鏈接。我已經改變了答案中的鏈接,但在這裏。 http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html –