O FOR UPDATE vai travar tanto a leitura por outras transações quanto por outros usuários.
ou seja, bloqueia qualquer operação??
veja o codigo
// captura dados do mecanismo que vai forjar o item e o item a ser forjado
$ArrayForja = $SqlForja->fetch_array(MYSQLI_ASSOC);
// inicia transaction para remover os itens do inventario
$this->db->consql->query("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION;");
$this->db->consql->query("SELECT * FROM inventario WHERE meca_id = ".$this->id." FOR UPDATE;");
// cria variavel vazia que vai remover os materiais necessarios para criar o item
$QrMateriais = "";
// verifica se o mecanismo do jogador tem todos os itens da forja no inventario
WHILE ($ArrayMateriais = $SqlMateriais->fetch_array(MYSQLI_ASSOC))
{
// cria query where de filtragem dos itens a serem pesquisados
$Where = "WHERE meca_id = ".$this->id." AND item_id = ".$ArrayMateriais['item_id']." AND equipado = 0 ORDER BY nivel LIMIT ".$ArrayMateriais['quantia'].";";
// cria query que verifica se o mecanismo do jogador tem o material
$Qr = "SELECT id FROM inventario ".$Where;
// executa query
$this->db->consql->query($Qr);
// verifica se o foi tirada a quantia necessaria do item se não da rollback
IF ($this->db->consql->affected_rows != $ArrayMateriais['quantia'])
{
print "Faltam itens para completar esta forja.";
RETURN FALSE;
}
ELSE
{
// implementa query para remover material
$QrMateriais .= "DELETE FROM inventario ".$Where;
}
}
// cria a query para adicionar o item forjado no inventario
$Qr = "INSERT INTO inventario(meca_id,item_id,drone_drop,drone_quantia,equipado) VALUES (".$this->id.",".$ArrayForja['item_id'].",0,0,0);";
// implementa na query de adicionar o item forjado as queries para remover os materias usados na forja
$Qr .= $QrMateriais;
// executa query
$this->db->consql->multi_query($Qr);
// executa query para aplicar modificações feitas na transaction
$this->db->consql->query("COMMIT");
print "Item forjado com sucesso. Já disponivel no inventário.";
RETURN TRUE;
veja que quando chamo a função
$this->db->consql->query("SELECT * FROM inventario WHERE meca_id = ".$this->id." FOR UPDATE;");
quero prevenir que ninguem delete,altere ou faça leitura desses registros no banco ate chegar no commit ou rollback do codigo
Edição feita por: DouglasDomi, 09/07/2011, 16:21.