Musim Semi - Manajemen Transaksi
Transaksi database adalah urutan tindakan yang diperlakukan sebagai satu unit kerja. Tindakan ini harus selesai seluruhnya atau tidak berpengaruh sama sekali. Manajemen transaksi adalah bagian penting dari aplikasi perusahaan yang berorientasi RDBMS untuk memastikan integritas dan konsistensi data. Konsep transaksi dapat dijelaskan dengan empat properti utama berikut yang dijelaskan sebagaiACID -
Atomicity - Transaksi harus diperlakukan sebagai satu unit operasi, yang berarti seluruh urutan operasi berhasil atau tidak berhasil.
Consistency - Ini mewakili konsistensi integritas referensial dari database, kunci utama unik dalam tabel, dll.
Isolation- Mungkin ada banyak pemrosesan transaksi dengan kumpulan data yang sama pada waktu yang sama. Setiap transaksi harus diisolasi dari yang lain untuk mencegah korupsi data.
Durability - Setelah transaksi selesai, hasil transaksi ini harus dibuat permanen dan tidak dapat dihapus dari database karena kegagalan sistem.
Sistem basis data RDBMS yang nyata akan menjamin keempat properti untuk setiap transaksi. Tampilan sederhana dari transaksi yang dikeluarkan ke database menggunakan SQL adalah sebagai berikut -
Mulailah transaksi menggunakan perintah mulai transaksi .
Lakukan berbagai operasi yang dihapus, perbarui, atau sisipkan menggunakan kueri SQL.
Jika semua operasi berhasil maka lakukan komit jika tidak, kembalikan semua operasi.
Framework Spring menyediakan lapisan abstrak di atas berbagai API manajemen transaksi yang mendasarinya. Dukungan transaksi Spring bertujuan untuk memberikan alternatif untuk transaksi EJB dengan menambahkan kemampuan transaksi ke POJO. Spring mendukung manajemen transaksi terprogram dan deklaratif. EJB membutuhkan server aplikasi, tetapi manajemen transaksi Spring dapat diterapkan tanpa memerlukan server aplikasi.
Transaksi Lokal vs. Global
Transaksi lokal dikhususkan untuk satu sumber daya transaksional seperti koneksi JDBC, sedangkan transaksi global dapat menjangkau beberapa sumber daya transaksional seperti transaksi dalam sistem terdistribusi.
Manajemen transaksi lokal dapat berguna dalam lingkungan komputasi terpusat di mana komponen dan sumber daya aplikasi berada di satu situs, dan manajemen transaksi hanya melibatkan pengelola data lokal yang berjalan pada satu mesin. Transaksi lokal lebih mudah diimplementasikan.
Manajemen transaksi global diperlukan dalam lingkungan komputasi terdistribusi di mana semua sumber daya didistribusikan ke berbagai sistem. Dalam kasus seperti itu, manajemen transaksi perlu dilakukan baik di tingkat lokal maupun global. Transaksi terdistribusi atau global dijalankan di beberapa sistem, dan pelaksanaannya memerlukan koordinasi antara sistem manajemen transaksi global dan semua pengelola data lokal dari semua sistem yang terlibat.
Terprogram vs. Deklaratif
Spring mendukung dua jenis manajemen transaksi -
Manajemen transaksi terprogram - Ini berarti Anda harus mengelola transaksi dengan bantuan pemrograman. Itu memberi Anda fleksibilitas ekstrim, tetapi sulit untuk dipelihara.
Manajemen transaksi deklaratif - Ini berarti Anda memisahkan manajemen transaksi dari kode bisnis. Anda hanya menggunakan anotasi atau konfigurasi berbasis XML untuk mengelola transaksi.
Pengelolaan transaksi deklaratif lebih disukai daripada pengelolaan transaksi terprogram meskipun kurang fleksibel daripada pengelolaan transaksi terprogram, yang memungkinkan Anda mengontrol transaksi melalui kode Anda. Tetapi sebagai semacam masalah lintas sektor, manajemen transaksi deklaratif dapat dimodulasi dengan pendekatan AOP. Spring mendukung manajemen transaksi deklaratif melalui kerangka kerja Spring AOP.
Abstraksi Transaksi Musim Semi
Kunci abstraksi transaksi Spring ditentukan oleh antarmuka org.springframework.transaction.PlatformTransactionManager , yaitu sebagai berikut -
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Sr Tidak | Metode & Deskripsi |
---|---|
1 | TransactionStatus getTransaction(TransactionDefinition definition) Metode ini mengembalikan transaksi yang sedang aktif atau membuat yang baru, sesuai dengan perilaku propagasi yang ditentukan. |
2 | void commit(TransactionStatus status) Metode ini melakukan transaksi tertentu, sehubungan dengan statusnya. |
3 | void rollback(TransactionStatus status) Metode ini melakukan rollback dari transaksi yang diberikan. |
The TransactionDefinition adalah antarmuka inti dari dukungan transaksi di musim semi dan itu didefinisikan sebagai berikut -
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
Sr Tidak | Metode & Deskripsi |
---|---|
1 | int getPropagationBehavior() Metode ini mengembalikan perilaku propagasi. Spring menawarkan semua opsi propagasi transaksi yang familiar dari EJB CMT. |
2 | int getIsolationLevel() Metode ini mengembalikan sejauh mana transaksi ini diisolasi dari pekerjaan transaksi lainnya. |
3 | String getName() Metode ini mengembalikan nama transaksi ini. |
4 | int getTimeout() Metode ini mengembalikan waktu dalam detik di mana transaksi harus diselesaikan. |
5 | boolean isReadOnly() Metode ini mengembalikan apakah transaksi hanya-baca. |
Berikut ini adalah nilai yang mungkin untuk tingkat isolasi -
Sr Tidak | Isolasi & Deskripsi |
---|---|
1 | TransactionDefinition.ISOLATION_DEFAULT Ini adalah tingkat isolasi default. |
2 | TransactionDefinition.ISOLATION_READ_COMMITTED Menunjukkan bahwa pembacaan kotor dicegah; pembacaan yang tidak berulang dan pembacaan bayangan dapat terjadi. |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED Menunjukkan bahwa pembacaan kotor, pembacaan tidak berulang, dan pembacaan bayangan dapat terjadi. |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ Menunjukkan bahwa pembacaan kotor dan pembacaan yang tidak berulang dapat dicegah; pembacaan hantu dapat terjadi. |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE Menunjukkan bahwa pembacaan kotor, pembacaan tidak berulang, dan pembacaan bayangan dicegah. |
Berikut ini adalah nilai yang mungkin untuk jenis propagasi -
Sr.No. | Propagasi & Deskripsi |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY Mendukung transaksi saat ini; melempar pengecualian jika tidak ada transaksi saat ini. |
2 | TransactionDefinition.PROPAGATION_NESTED Eksekusi dalam transaksi bersarang jika ada transaksi saat ini. |
3 | TransactionDefinition.PROPAGATION_NEVER Tidak mendukung transaksi saat ini; melempar pengecualian jika ada transaksi saat ini. |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED Tidak mendukung transaksi saat ini; lebih baik selalu mengeksekusi secara nontransaksional. |
5 | TransactionDefinition.PROPAGATION_REQUIRED Mendukung transaksi saat ini; membuat yang baru jika tidak ada. |
6 | TransactionDefinition.PROPAGATION_REQUIRES_NEW Membuat transaksi baru, menangguhkan transaksi saat ini jika ada. |
7 | TransactionDefinition.PROPAGATION_SUPPORTS Mendukung transaksi saat ini; mengeksekusi secara non-transaksional jika tidak ada. |
8 | TransactionDefinition.TIMEOUT_DEFAULT Menggunakan waktu tunggu default dari sistem transaksi yang mendasarinya, atau tidak ada jika batas waktu tidak didukung. |
The TransactionStatus antarmuka memberikan cara mudah untuk kode transaksional untuk eksekusi transaksi kontrol dan status transaksi query.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
Sr.No. | Metode & Deskripsi |
---|---|
1 | boolean hasSavepoint() Metode ini mengembalikan apakah transaksi ini secara internal membawa savepoint, yaitu telah dibuat sebagai transaksi bersarang berdasarkan savepoint. |
2 | boolean isCompleted() Metode ini mengembalikan apakah transaksi ini selesai, yaitu apakah sudah dilakukan atau dibatalkan. |
3 | boolean isNewTransaction() Metode ini mengembalikan nilai true jika transaksi saat ini baru. |
4 | boolean isRollbackOnly() Metode ini mengembalikan apakah transaksi telah ditandai sebagai rollback-only. |
5 | void setRollbackOnly() Metode ini menyetel transaksi sebagai hanya rollback. |