Wednesday, April 1, 2009

Transaction

Saat menggunakan JPA, saya sempat bertanya-tanya kapankah suatu entity menjadi attached dan detached dan kapankah sebuah transaction di-commit atau rollback. Berikut yang saya dapat :

Jika menggunakan container-managed-transaction (CMT) dan transaction-scoped EntityManager maka transaksi dimulai ketika method dijalankan dan berakhir (entity detached dan transaction commit atau rollback) saat method selesai dieksekusi. Pilihan ini sudah cukup memadai jika kita melakukan transaksi dari komponen EJB (session bean & MDB).

// default
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OrderManagerBean {

// default
@PersistenceContext(type=PersistenceContextType.TRANSACTION)
EntityManager entityManager;

Jika menggunakan container-managed-transaction (CMT) dan extended-scoped EntityManager maka transaksi dimulai ketika method dijalankan dan berakhir (transaction commit atau rollback) saat method selesai dieksekusi. Sedangkan entity tetap attached selama EntityManager belum ditutup. Pilihan ini biasanya dipilih jika kita melakukan transaksi dari komponen EJB (stateful session bean).

// default
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OrderManagerBean {

@PersistenceContext(type=PersistenceContextType.EXTENDED)
EntityManager entityManager;

Jika menggunakan application-managed-transaction maka transaction selesai saat kita secara eksplisit memanggil EntityTransaction.commit(), dan entity menjadi detached saat kita memanggil EntityManager.close(). Pilihan ini untuk aplikasi di mana JTA tidak tersedia, misal dari aplikasi JavaSE.

Jika menggunakan bean-managed-transaction (BMT) maka transaksi dimulai ketika userTransaction.begin() dijalankan dan berakhir (transaction commit atau rollback) saat userTransaction.commit() dieksekusi. Pilihan ini diambil jika kita melakukan transaksi dari aplikasi yang memiliki JTA seperti dalam komponen EJB atau pada web tier (seperti pada HttpServlet).

@TransactionManagement(TransactionManagementType.BEAN)
public class OrderManagerBean {
@Resource
private UserTransaction userTransaction;
public void placeSnagItOrder(Item item, Customer customer){
try {
userTransaction.begin();
...
userTransaction.commit();
} catch (CreditValidationException cve) {
userTransaction.rollback();
} catch (CreditProcessingException cpe){
userTransaction.rollback();
} catch (DatabaseException de) {
userTransaction.rollback();
} catch (Exception e) {
e.printStackTrace();
}
}
}

Wow... Jadi ada yang disebut EntityTrasaction dan UserTransaction? Apa bedanya? Dan mana yang harus dipakai? Berikut saya ambilkan jawaban Debu Panda dari pertanyaan yang sama di CodeRanch.com :

"...UserTransaction is provided by JTA and provided by the application server's JTA Transaction Manager that supports global transaction. The EntityTransaction is essentially a high-level abstraction over a resource localJDBC transaction, as opposed to the distributed JTA transaction. EntityTransaction is supposed to be used when JTA transaction is not available outside the container...."

2 comments:

dwi ardi irawan said...

maksud nya attached dan detached ? apaan ?

Rochmat Santoso said...

Attached berarti entity tsb sedang di-manage oleh EntityManager dng melakukan sinkronisasi entity dng table di database yg sesuai. Detached berarti entity sedang berada di luar jangkauan EntityManager. Perubahan yg terjadi pada entity tidak disinkronisasi dng table database. Agar suatu entity kembali dalam kondisi attached, kita bisa gunakan EntityManager.merge()

 

©2009 Stay the Same | by TNB