För att svara på din första fråga...
När du använder transaktioner körs dina frågor normalt när det gäller din anslutning. Du kan välja att genomföra, spara dessa ändringar eller återställa alla ändringar. Tänk på följande pseudokod:
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.
Slumptalet som genererades kan läsas innan commit för att säkerställa att det är lämpligt innan du sparar det för alla att se (t.ex. commit och lås upp raden).
Om PDO-drivrutinen inte fungerar, överväg att använda mysqli-drivrutinen. Om det inte är ett alternativ kan du alltid använda frågan 'select last_insert_id() som id;' snarare än $this->db->insert_id()-funktionen.
För att svara på din andra fråga, om du infogar eller uppdaterar data som andra modeller kommer att uppdatera eller läsa, se till att använda transaktioner. Till exempel, om kolumnen 'Antal_återstående' är inställd på 1 kan följande problem uppstå.
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
Att använda transaktioner i samma situation skulle ge detta resultat:
Du kanske vill läsa mer om transaktionsisoleringsnivåer likaså.
Var försiktig med dödläge, som kan uppstå i det här fallet:
I slutet, eftersom person B förmodligen har nått PHPs max_execution_time
, kommer den aktuella frågan att slutföras oberoende av PHP, men inga ytterligare frågor kommer att tas emot. Om detta var en transaktion med autocommit=0 kommer frågan automatiskt att återställas när anslutningen till din PHP-server bryts.