Om je eerste vraag te beantwoorden...
Bij het gebruik van transacties worden uw zoekopdrachten normaal uitgevoerd voor zover het uw verbinding betreft. U kunt ervoor kiezen om vast te leggen, die wijzigingen op te slaan of terug te draaien, waarbij alle wijzigingen ongedaan worden gemaakt. Beschouw de volgende pseudo-code:
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.
Het willekeurige getal dat is gegenereerd, kan worden gelezen voordat het wordt vastgelegd om ervoor te zorgen dat het geschikt is voordat het wordt opgeslagen zodat iedereen het kan zien (bijvoorbeeld de rij vastleggen en ontgrendelen).
Als het PDO-stuurprogramma niet werkt, overweeg dan om het mysqli-stuurprogramma te gebruiken. Als dat geen optie is, kun je altijd de query 'select last_insert_id() as id;' gebruiken. in plaats van de $this->db->insert_id() functie.
Om uw tweede vraag te beantwoorden:als u gegevens invoert of bijwerkt die andere modellen zullen bijwerken of lezen, moet u transacties gebruiken. Als een kolom 'Number_remaining' bijvoorbeeld is ingesteld op 1 kan het volgende probleem optreden.
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
Het gebruik van transacties in dezelfde situatie zou dit resultaat opleveren:
Misschien wil je meer lezen over isolatieniveaus voor transacties ook.
Pas op voor een impasse, die in dit geval kan optreden:
Aan het einde, aangezien Persoon B waarschijnlijk PHP's max_execution_time
heeft bereikt , zal de huidige zoekopdracht onafhankelijk van PHP worden uitgevoerd, maar er zullen geen verdere vragen worden ontvangen. Als dit een transactie was met autocommit=0, wordt de query automatisch teruggedraaid wanneer de verbinding met uw PHP-server wordt verbroken.