2011-12-08 3 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

그런 테이블의 일부를 잠글 수 없습니다. 단지 커밋 또는 롤백 트랜잭션,

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

을 그리고 UNLOCK TABLES하지 않으며 : 당신이 중 하나는 테이블 또는하지 LOCK TABLES

이처럼 SELECTFOR UPDATE를 추가 작성하기위한 특정 행을 잠글로를 잠 그려면 잠금 장치가 해제됩니다.

+0

감사합니다. 이 문서를 찾기가 어렵습니다! 감사! – cgwebprojects

+0

더 나은 링크를 찾았습니다. 나는 대답의 링크를 변경했지만 여기있다. http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html –

관련 문제