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.