Yii 2 - Database Transaction

alfa6661
- January 20, 2016
0 (0 votes)
Rate :
Penggunaan database transaction dalam Yii2 Framework

Mungkin ada yg pernah mengalami, dalam satu proses terdiri dari banyak query, misalkan ada beberapa query insert yang dilakukan dalam satu proses. Apa yang akan terjadi jika salah satu query tersebut gagal di eksekusi? Hal ini tentu saja akan menghasilkan ketidak konsistenan data atau dengan kata lain, data yang di hasilkan tidak valid.

Untuk menangani hal tersebut, ada yang namanya Transaction. Transaction dapat digunakan untuk menjaga konsistensi dan keakuratan data, memastikan bahwa suatu proses yang dijalankan terhadap database dilaksanakan seluruhnya atau tidak sama sekali. Dengan kata lain, Saat menjalankan beberapa query secara berurutan, Kita perlu untuk membungkus mereka dalam sebuah transaction untuk memastikan integritas dan konsistensi dari database. Jika salah satu query gagal, database akan dikembalikan kedalam keadaan seolah-olah tidak ada query dieksekusi (ROLLBACK)

Pada kali ini kita akan membahas penggunaan transaction pada Yii 2 Framework.

Contohnya kita memiliki 2 tabel yaitu father dan children dengan skema sebagai berikut:

Father

Kolom Tipe Data
id Integer Primary Key
name String Not Null

Children

Kolom Tipe Data
id Integer Primary Key
father_id Integer
name String Not Null

Dengan contoh table diatas, kita diharuskan untuk menginsert data kedua tabel diatas dalam satu kali proses. Dengan menggunakan Yii Database Access Objects (DAO), kode yang akan dibuat kurang lebih seperti ini:

Yii::$app->db->createCommand("INSERT INTO father.....")->execute();
Yii::$app->db->createCommand("INSERT INTO children...")->execute();

Pada kasus kali ini kita akan membuat kondisi error pada salah satu query diatas.

Yii::$app->db->createCommand("INSERT INTO father VALUES(1, 'Father 1')")->execute();
Yii::$app->db->createCommand("INSERT INTO children VALUES(1, 1, 'Child 1')")->execute();
// berikan error dengan memberi nilai null
Yii::$app->db->createCommand("INSERT INTO children VALUES(2, 1, NULL)")->execute();

Kode diatas akan menghasilkan errorpadaqueryterakhir.

Integrity constraint violation – yii\db\IntegrityException
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
The SQL being executed was: INSERT INTO children VALUES(2, 1, NULL)

Tapi apa yang terjadi dengan 2 query pertama? 2 query pertama akan sukses di eksekusi, dan data telah tersimpan di database. Hal ini tentu saja akan merusak data dalam database.Karena masalah inilah, transaction ada.

Untuk menggunakan transaction kita harus memulai dengan method beginTransaction() dalam query kita. Kemudian diakhiri dengan method commit() jika seluruh transaksi sukses di eksekusi, dan gunakan method rollBack() jika terdapat salah satu query gagal.

Contoh

$transaction = Yii::$app->db->beginTransaction();
try {
	Yii::$app->db->createCommand("INSERT INTO father VALUES(1, 'Father 1')")->execute();
 	Yii::$app->db->createCommand("INSERT INTO children VALUES(1, 1, 'Child 1')")->execute();
 	// berikan error dengan memberi nilai null
 	Yii::$app->db->createCommand("INSERT INTO children VALUES(2, 1, NULL)")->execute();
 	$transaction->commit();
}
catch(\Exception $e) {
	$transaction->rollBack();
	throw$e;
}

Kode diatas akan tetap menghasilkan error yang sama dengan sebelumnya, karena kita menggunakan fungsi throw untuk menampilkan error. Akan tetapi, dengan kode ini, 2 query pertama tidak akan tersimpan didatabase.

Contoh penulisan lain

Yii::$app->db->transaction(function($db) {
	$db->createCommand("INSERT INTO father VALUES(1, 'Father 1')")->execute();
 	$db->createCommand("INSERT INTO children VALUES(1, 1, 'Child 1')")->execute();
 	$db->createCommand("INSERT INTO children VALUES(2, 1, NULL)")->execute();
});

Mungkin terlihat sederhana, akan tetapi transaction ini sangat penting sekali untuk menjaga keakuratan data. Bisa dibayangkan jika ini berhubungan dengan transaksi keuangan.Mengerikan!!!

Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter

– Eric S. Raymond

Have a better explanation?

If you have comments about this post. Please write your comments below

No comments associated with this article