Untuk menjawab pertanyaan pertama Anda...
Saat menggunakan transaksi, kueri Anda dijalankan secara normal sejauh menyangkut koneksi Anda. Anda dapat memilih untuk melakukan, menyimpan perubahan tersebut, atau mengembalikan, mengembalikan semua perubahan. Perhatikan pseudo-code berikut:
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.
Nomor acak yang dihasilkan dapat dibaca sebelum dikomit untuk memastikan bahwa itu cocok sebelum menyimpannya untuk dilihat semua orang (misalnya komit dan membuka kunci baris).
Jika driver PDO tidak berfungsi, pertimbangkan untuk menggunakan driver mysqli. Jika itu bukan opsi, Anda selalu dapat menggunakan kueri 'select last_insert_id() as id;' daripada fungsi $this->db->insert_id() .
Untuk menjawab pertanyaan kedua Anda, jika Anda memasukkan atau memperbarui data yang akan diperbarui atau dibaca oleh model lain, pastikan untuk menggunakan transaksi. Misalnya, jika kolom 'Number_remaining' disetel ke 1, masalah berikut dapat terjadi.
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
Menggunakan transaksi dalam situasi yang sama akan menghasilkan hasil ini:
Anda mungkin ingin membaca tentang tingkat isolasi transaksi juga.
Hati-hati dengan kebuntuan, yang dapat terjadi dalam hal ini:
Pada akhirnya, karena Orang B mungkin telah mencapai max_execution_time
PHP , kueri saat ini akan selesai dieksekusi secara independen dari PHP, tetapi tidak ada kueri lebih lanjut yang akan diterima. Jika ini adalah transaksi dengan autocommit=0, kueri akan dibatalkan secara otomatis saat koneksi ke server PHP Anda terputus.