Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obter o último ID de inserção do mysql funciona com transações? + perguntas sobre transações


Respondendo sua primeira pergunta...

Ao utilizar transações, suas consultas são executadas normalmente no que diz respeito à sua conexão. Você pode optar por confirmar, salvar essas alterações ou reverter, revertendo todas as alterações. Considere o seguinte pseudocódigo:
insert into number(Random_number) values (rand()); 
select Random_number from number where Number_id=Last_insert_id();

//php
if($num < 1)
   $this->db->query('rollback;'); // This number is too depressing.
else
   $this->db->query('commit;'); // This number is just right.

O número aleatório que foi gerado pode ser lido antes do commit para garantir que seja adequado antes de salvá-lo para que todos vejam (por exemplo, confirmar e desbloquear a linha).

Se o driver PDO não estiver funcionando, considere usar o driver mysqli. Se isso não for uma opção, você sempre pode usar a consulta 'select last_insert_id() as id;' em vez da função $this->db->insert_id().

Para responder sua segunda pergunta, se você estiver inserindo ou atualizando dados que outros modelos irão atualizar ou ler, certifique-se de usar transações. Por exemplo, se uma coluna 'Number_remaining' for definida como 1, o seguinte problema poderá ocorrer.
Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0

Usar transações na mesma situação produziria este resultado:

Você pode querer ler sobre níveis de isolamento de transação também.

Tenha cuidado com o impasse, que pode ocorrer neste caso:

No final, como a Pessoa B provavelmente atingiu o max_execution_time do PHP , a consulta atual terminará de ser executada independentemente do PHP, mas nenhuma outra consulta será recebida. Se esta foi uma transação com autocommit=0, a consulta será revertida automaticamente quando a conexão com seu servidor PHP for cortada.