Persyaratan yang ketat untuk mengendalikan konkurensi dan transaksi dalam sistem komputasi modern sangat diperlukan untuk menjaga integritas, konsistensi, dan kinerja basis data dan aplikasi. Dalam perbankan, e-commerce, sistem perusahaan, dll., penanganan transaksi sangat penting untuk memastikan bahwa operasi dapat diselesaikan dengan sukses dan data sensitif tetap akurat dan dapat diandalkan.
Apa yang dimaksud dengan Transaksi?
Transaksi adalah unit pekerjaan logis, dan terdiri dari pekerjaan yang telah selesai atau belum selesai sama sekali. Transaksi biasanya terdiri dari beberapa operasi, yang mungkin termasuk membaca, menulis, dan memperbarui data dalam sistem database. - Untuk memastikan konsistensi data, transaksi harus mengikuti ACID Properties:
- Atom: Sebuah Transaksi adalah satu unit independen. Seluruh transaksi dibatalkan ketika ada bagian dari transaksi yang gagal.
- Konsistensi: Sebuah transaksi mengambil basis data dari satu kondisi yang valid ke kondisi lainnya.
- Isolasi: Transaksi yang terjadi bersamaan tidak mengganggu transaksi lainnya.
- Daya tahan: Setelah transaksi dilakukan, perubahan tetap utuh meskipun terjadi kegagalan dalam sistem.
Sebagai contoh, pertimbangkan untuk mentransfer uang antara dua rekening bank. Transaksi harus memastikan bahwa dana dikurangkan dari satu rekening dan ditambahkan ke rekening lainnya. Jika salah satu operasi gagal, transaksi tidak boleh diselesaikan untuk menghindari inkonsistensi data.
Konkurensi dalam Transaksi
Hal ini dikenal sebagai konkurensi, karena beberapa transaksi dieksekusi pada waktu yang sama. Konkurensi meningkatkan throughput sistem dan pemanfaatan sumber daya, tetapi jika tidak ditangani dengan benar, dapat menyebabkan beberapa masalah, termasuk:
1. Pembacaan Kotor: Pembacaan dari sebuah transaksi yang membaca perubahan yang tidak dilakukan oleh transaksi lain yang dapat menyebabkan data kotor.
2. Pembacaan yang Tidak Dapat Diulang: Ini terjadi ketika sebuah transaksi membaca sebuah baris data dua kali namun selalu menghasilkan nilai yang berbeda karena beberapa transaksi lain telah memodifikasi data di antara pembacaan tersebut.
3. Pembacaan Phantom (Phantom Reads): Sebuah transaksi mengeksekusi ulang sebuah kueri dan mengambil baris yang ditambahkan atau dihapus oleh transaksi lain.
Teknik untuk Mengontrol Konkurensi
Untuk menjawab tantangan-tantangan tersebut, sistem menggunakan mekanisme kontrol konkurensi untuk menentukan bagaimana transaksi berinteraksi:
1. Penguncian Pesimistis: Bekerja dengan mendapatkan kunci pada sumber daya yang dibutuhkan oleh sebuah transaksi sehingga mencegah semua transaksi lain untuk menulis ke sumber daya yang sama. Meskipun berfungsi untuk menghilangkan masalah, memblokir transaksi menyebabkan penurunan kinerja sistem.
2. Kontrol Konkurensi Optimis (Optimistic Concurrency Control/OCC): Sebuah sistem yang berorientasi pada transaksi, teknik ini tidak mengunci tetapi mengizinkan transaksi untuk dieksekusi dengan asumsi bahwa konflik diminimalkan. Hal ini dapat dicoba kembali pada waktu commit, di mana sistem akan memeriksa konflik. OCC sangat cocok untuk skenario pertikaian yang rendah.
3. Kontrol Konkurensi Multiversi (MVCC): Daripada mengunci sumber daya, MVCC mempertahankan beberapa versi item data, sehingga memungkinkan transaksi dieksekusi pada snapshot database. Metode ini menghindari pemblokiran pembacaan, dan membantu keseragaman, tetapi dapat menyebabkan overhead penyimpanan tambahan.
4. Penguncian Dua Fase (2PL): Protokol ini membagi operasi transaksi ke dalam dua fase: memperoleh kunci dan melepaskan kunci. Meskipun memastikan serialisasi, 2PL dapat menyebabkan kebuntuan di mana transaksi menunggu tanpa batas waktu untuk sumber daya yang dimiliki satu sama lain.
Panduan untuk Bekerja dengan Transaksi dan Konkurensi
Untuk melakukan manajemen transaksi dan konkurensi dengan baik:
1. Berhati-hatilah dalam merancang transaksi: Buatlah transaksi sesingkat dan sesempurna mungkin untuk meminimalkan perebutan sumber daya.
2. Konsistensi Data: Data yang tidak konsisten dapat terjadi karena tingkat isolasi yang berbeda dalam database, termasuk READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, dan SERIALIZABLE. Pilih tingkat antara prediktabilitas dan kinerja berdasarkan penggunaan Anda.
3. Mengembalikan sewa yang valid: Panjang status, dan sumber daya yang diminta tidak boleh melebihi batas sumber daya target.
4. Menerapkan mekanisme percobaan ulang: Untuk konflik atau kegagalan, perkenalkan logika percobaan ulang, terutama untuk kontrol konkurensi yang optimis.
5. Memonitor Kinerja: Memantau kinerja transaksi secara terus menerus untuk mengidentifikasi kemacetan dan mengoptimalkan sumber daya sistem.
Kesimpulan
Menangani transaksi dan konkurensi sangat penting untuk membangun sistem yang kuat dan berkinerja tinggi. Dengan mematuhi properti ACID dan menggunakan teknik kontrol konkurensi yang tepat, pengembang dapat memastikan konsistensi dan integritas data sekaligus memaksimalkan hasil. Di dunia yang semakin bergantung pada data, menguasai konsep-konsep ini sangat penting untuk menghadirkan aplikasi yang andal dan efisien.