2011-12-08 149 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 –