Pada post ini saya akan menjelaskan salah satu annotation nya Spring framework yaitu '@transactional'. Annotation '@transactional' ini digunakan untuk memberitahu Spring bahwa klass/method yang di tandain dengan '@Transactional' adalah method atau class yang akan melakukan transaksi dengan database. Untuk lebih singkatnya annotation inilah yang akan mengani rollback n commit saat transaksi db berlangsung
perlu diketahui jika kita tidak menggunakan annotation ini makan programmer lah yang harus menulis baris code untuk melakukan rollback jika terjadi kesalahan pada saat transaksi dan meng-commitnya bila semua transaksi telah sukses. Satu lagi, programmer harus menangani sendiri kapan session transaksi dibuka dan kapan transaksi itu di tutup. Di bawah ini adalah contoh Script jika tidak menggunakan annotation '@Transactional'.
Session session = null; Transaction tx = null; try{ session = HibernateUtil.getSessionFactory().openSession(); //session di open tx = session.beginTransaction(); //transaksi di mulai /* *Lakukan select insert update disini sesuai dengan bisnis logic */ simpanDataVoid1();//anggap saja kita sudah buat void untuk simpan data simpanDataVoid2(); updateVoid(); tx.commit();//commit transaksi jika semua baris select/insert/update sukses di jalankan }catch(RuntimeException e){ tx.rollback(); //rollback semua transaksi jika terjadi failure di salah satu statement transaksi throw e; }finally{ if(session!=null){ session.close(); //close session } }
Snipet kode di atas memang keliatan sangat jelas kapan open session, kapan commit, kapan rollback kapan close session tapi kode di atas memiliki kelemahan apabila kita akan melakukan nya di session yang berbeda makan kita juga akan menulis kode tersebut berulang-ulang. Ini tentunya akan mengakibatkan rawan terjadinya error apalagi untuk aplikasi sekala besar.
Menggunakan Spring annotation @Transactional
Jika menggunakan Spring @Transactional maka akan jadi sesimple ini:
@Transactional public void businessLogic() { /* *Lakukan select insert update disini sesuai dengan bisnis logic */ simpanDataVoid1();//anggap saja kita sudah buat void untuk simpan data simpanDataVoid2(); updateVoid(); }
Cara ini tentunya saat nyaman, dan lebih simple dari pada cara yang pertama. Spring akan menangani sendiri masalah session dan rollback untuk annotation @Transactional. Sebelum void 'businessLogic' dipanggil spring secara otomatis membuka session dan mencomit nya. Bagaimana jika terjadi failure? Spring juga akan me-rollback jika terjadi fail di salah satu baris.
Untuk saat ini cukup sampai disini pengenalan Spring @Transactional. Bila ada waktu luang saya akan menulis lagi kelanjutan artikel ini... Terimakasih terlah berkunjung