Ada tiga jenis transaksi Java: transaksi JDBC, transaksi JTA (Java Transaction), dan transaksi kontainer. Transaksi wadah umum seperti transaksi pegas. Transaksi kontainer terutama disediakan oleh server aplikasi J2EE. Sebagian besar transaksi kontainer diselesaikan berdasarkan JTA. Ini adalah implementasi API yang berbasis JNDI, cukup kompleks. Oleh karena itu, artikel ini tidak akan membahas transaksi kontainer untuk saat ini. Artikel ini terutama memperkenalkan dua transaksi yang relatif mendasar dalam pengembangan J2EE: transaksi JDBC dan transaksi JTA.
Transaksi JDBC
Semua perilaku, termasuk transaksi, JDBC, didasarkan pada koneksi, dan manajemen transaksi dilakukan melalui objek koneksi di JDBC. Dalam JDBC, metode terkait transaksi yang umum digunakan adalah: setautocommit, commit, rollback, dll.
Berikut adalah kode transaksi JDBC sederhana:
public void jdbctransfer () {java.sql.connection conn = null; coba {conn = conn = driverManager.getConnection ("jdbc: oracle: tipis: @host: 1521: sid", "username", "userpwd"); // Atur komitmen otomatis ke false, // jika disetel ke true, database akan mengenali setiap pembaruan data sebagai transaksi dan secara otomatis mengirimkan conn.setAutocommit (false); stmt = conn.createStatement (); // Kurangi jumlah dalam akun a oleh 500 stmt.execute ("/ update t_account set jumlah = jumlah - 500 di mana account_id = 'a'"); // Tingkatkan jumlah di akun b oleh 500 stmt.execute ("/ update t_account set jumlah = jumlah + 500 di mana account_id = 'b'"); // Kirim transaksi conn.commit (); // Transaction Commit: Operasi dua langkah dari transfer berhasil pada saat yang sama} catch (sqlexception sqle) {coba {// pengecualian terjadi, rollback () dalam transaksi ini conn.rollback (); // Transaction Rollback: Operasi dua langkah dari transfer benar-benar mencabut stmt.close (); conn.close (); } catch (pengecualian abaikan) {} sqle.printstacktrace (); }}Kode di atas mengimplementasikan fungsi transfer sederhana, yang mengontrol operasi transfer melalui transaksi, baik mengirimkan atau memutar kembali.
Pro dan kontra dari transaksi JDBC
JDBC menyediakan dukungan paling dasar untuk operasi transaksi basis data menggunakan Java. Melalui transaksi JDBC, kita dapat menempatkan beberapa pernyataan SQL ke dalam transaksi yang sama untuk memastikan karakteristik asamnya. Keuntungan utama dari transaksi JDBC adalah bahwa API relatif sederhana, dapat menerapkan operasi transaksi paling dasar, dan kinerjanya relatif baik.
Namun, transaksi JDBC memiliki satu batasan: transaksi JDBC tidak dapat menjangkau banyak database! Lai Lai Oleh karena itu, jika beberapa operasi basis data atau skenario terdistribusi terlibat, transaksi JDBC tidak berdaya.
Transaksi JTA
Mengapa JTA Dibutuhkan
Biasanya, transaksi JDBC dapat menyelesaikan masalah seperti konsistensi data. Mengingat bahwa penggunaannya relatif sederhana, banyak orang hanya tahu bahwa ada transaksi JDBC tentang transaksi di Java, atau bahwa beberapa orang tahu tentang transaksi dalam kerangka kerja (seperti Hibernate, Spring), dll. Namun, karena JDBC tidak dapat menerapkan transaksi yang didistribusikan, dan ada lebih banyak skenario yang terdistribusi hari ini, JDBC.
Jika Anda tidak menemukan skenario bahwa transaksi JDBC tidak dapat diselesaikan di tempat kerja, maka Anda hanya dapat mengatakan bahwa proyek yang Anda lakukan masih terlalu kecil. Ambil situs web e-commerce sebagai contoh. Kami umumnya membagi situs web e-commerce secara horizontal menjadi modul produk, modul pesanan, modul keranjang belanja, modul pesan, modul pembayaran, dll. Kemudian kami menggunakan modul yang berbeda ke berbagai mesin, dan setiap modul berkomunikasi melalui panggilan layanan jarak jauh (RPC) dan metode lainnya. Memberikan layanan kepada dunia luar dengan sistem terdistribusi.
Proses pembayaran harus berinteraksi dengan beberapa modul, setiap modul digunakan dalam mesin yang berbeda, dan database yang dioperasikan oleh setiap modul tidak konsisten. Pada saat ini, JDBC tidak dapat digunakan untuk mengelola transaksi. Mari kita lihat sepotong kode:
/ ** Pemrosesan Pesanan Pembayaran **/ @Transactional (rollbackfor = Exception.class) public void completeDer () {orderdao.update (); // pesanan layanan secara lokal memperbarui status pesanan AccountService.update (); // Hubungi Layanan Akun Dana untuk menambahkan poin ke PointService Account PointService.update (); // Hubungi Layanan Poin untuk menambahkan poin ke poin Akun Akun Akun AccountService.insert (); // hubungi Layanan Akuntansi untuk menulis sistem akuntansi voucher asli voucher pedagang. Notify.notify (); // Hubungi Layanan Pemberitahuan Pedagang untuk mengirim pemberitahuan hasil pembayaran ke pedagang}Kode di atas adalah operasi proses pembayaran sederhana, di mana lima layanan disebut, yang semuanya disebut melalui RPC. Bagaimana cara memastikan konsistensi transaksi menggunakan JDBC? Saya menambahkan anotasi @transactional ke metode ini, tetapi karena penggunaan layanan terdistribusi, transaksi tidak dapat mencapai efek asam.
Transaksi JTA lebih kuat daripada transaksi JDBC. Transaksi JTA dapat memiliki banyak peserta, sedangkan transaksi JDBC terbatas pada koneksi database tunggal. Komponen dari salah satu platform Java berikut dapat berpartisipasi dalam transaksi JTA: Koneksi JDBC, Objek JDO PersistenceManager, JMS Antrian, Topik JMS, Enterprise JavaBeans (EJB), dan Alokasi Sumber Daya yang disusun dengan spesifikasi arsitektur J2EE Connector.
Definisi JTA
Java Transaction API (JTA) adalah versi Java Enterprise dari antarmuka program aplikasi. Di lingkungan Java, ini memungkinkan transaksi terdistribusi di beberapa sumber daya XA untuk diselesaikan.
JTA dan Layanan Transaksi Java rekan seninya (JTS; Java Transactionservice), menyediakan layanan transaksi terdistribusi untuk platform J2EE. Namun, JTA hanya menyediakan antarmuka dan tidak memberikan implementasi tertentu. Sebaliknya, disediakan oleh penyedia server J2EE sesuai dengan spesifikasi JTS. Ada beberapa implementasi JTA yang umum:
1. Implementasi JTA (JBOSS) Disediakan oleh J2EE Container
2. Implementasi JTA Independen: seperti JOTM, Atomikos. Implementasi ini dapat digunakan di lingkungan yang tidak menggunakan server aplikasi J2EE untuk memberikan jaminan transaksi terdistribusi. Seperti Tomcat, Jetty dan Aplikasi Java biasa.
JTA menyediakan java.transaction.userTransaction, yang mendefinisikan metode berikut.
Di sini, perlu dicatat bahwa operasi JDBC biasa dapat secara langsung dikonversi menjadi operasi JTA tanpa menggunakan UserTransaction. JTA memiliki persyaratan untuk sumber data, koneksi, dan sumber daya. Hanya kelas yang mematuhi spesifikasi XA dan mengimplementasikan antarmuka yang relevan dari spesifikasi XA yang dapat berpartisipasi dalam transaksi JTA. Mengenai spesifikasi XA, silakan lihat pengantar yang relevan di artikel lain di artikel saya. Di sini, izinkan saya menyebutkan bahwa database arus utama saat ini mendukung spesifikasi XA.
Untuk menggunakan transaksi JTA, Anda memerlukan driver JDBC yang mengimplementasikan javax.sql.xadataSource, javax.sql.xaconnection dan antarmuka javax.sql.xaresource. Driver yang mengimplementasikan antarmuka ini akan dapat berpartisipasi dalam transaksi JTA. Objek XadataSource adalah pabrik objek Xaconnection. XAConnection adalah koneksi JDBC yang berpartisipasi dalam transaksi JTA.
Untuk menggunakan transaksi JTA, Anda harus menggunakan XadataSource untuk menghasilkan koneksi basis data, dan koneksi yang dihasilkan adalah koneksi XA.
Perbedaan antara koneksi XA (javax.sql.xaconnection) dan koneksi non-XA (java.sql.connection) adalah bahwa XA dapat berpartisipasi dalam transaksi JTA dan tidak mendukung komitmen otomatis.
Kode contoh:
public void jtatransfer () {javax.transaction.usertransaction tx = null; java.sql.connection conn = null; coba {tx = (javax.transaction.userTransaction) context.lookup ("java: comp/usertransaction"); // Dapatkan transaksi JTA, dalam hal ini, wadah JBoss dikelola oleh javax.sql.datasource ds = (javax.sql.datasource) konteks.lookup ("java:/xaoracleds"); // Dapatkan kumpulan koneksi basis data, harus ada database dan driver yang mendukung XA yang mendukung tx.begin (); conn = ds.getConnection (); // Atur komitmen otomatis ke false, // jika disetel ke true, database akan mengenali setiap pembaruan data sebagai transaksi dan secara otomatis mengirimkan conn.setAutocommit (false); stmt = conn.createStatement (); // Kurangi jumlah dalam akun A dengan 500 stmt.execute ("/ update t_account set jumlah = jumlah - 500 di mana account_id = 'a'"); // Tingkatkan jumlah di akun b oleh 500 stmt.execute ("/ update t_account set jumlah = jumlah + 500 di mana account_id = 'b'"); // Tingkatkan jumlah di akun b oleh 500 stmt.execute ("/ update t_account set jumlah = jumlah + 500 di mana account_id = 'b'"); // Tingkatkan jumlah di akun b oleh 500 stmt.execute ("/ update t_account set jumlah = jumlah + 500 di mana account_id = 'b'"); // melakukan transaksi tx.commit (); // Transaction Commit: Operasi dua langkah transfer berhasil pada saat yang sama} catch (sqlexception sqle) {coba {// pengecualian terjadi, rollback () dalam transaksi ini; // Transaction Rollback: Operasi dua langkah transfer sepenuhnya dicabut stmt.close (); conn.close (); } catch (pengecualian abaikan) {} sqle.printstacktrace (); }} Contoh di atas adalah operasi transfer menggunakan transaksi JTA. Operasi ini relatif tergantung pada wadah J2EE dan membutuhkan transaksi pengguna dan koneksi yang diperoleh melalui JNDI.
Transaksi terdistribusi standar
Transaksi terdistribusi mencakup manajer transaksi dan satu atau lebih manajer sumber daya. Manajer Sumber Daya adalah penyimpanan data yang persisten dari jenis apa pun. Manajer transaksi memikul tanggung jawab komunikasi antara semua peserta transaksi.
Lihatlah pengantar di atas untuk transaksi terdistribusi, apakah ini mirip dengan manajemen transaksi dalam 2pc? Namun, 2PC sebenarnya adalah metode implementasi untuk manajer transaksi yang mematuhi spesifikasi XA untuk mengoordinasikan beberapa manajer sumber daya. Saya telah memiliki beberapa artikel di 2pc dan 3pc sebelumnya. Dalam artikel -artikel itu, saya telah memperkenalkan bagaimana manajer transaksi dalam transaksi terdistribusi mengoordinasikan komit atau rollback unified dari beberapa transaksi. Saya juga akan memperkenalkan secara rinci konten yang terkait dengan transaksi terdistribusi, termasuk tetapi tidak terbatas pada transaksi global, model DTP, transaksi fleksibel, dll.
Pro dan kontra JTA
Keuntungan dari JTA adalah memberikan larutan transaksi terdistribusi dan asam ketat. Namun, manajemen transaksi JTA standar tidak umum digunakan dalam pengembangan harian karena memiliki banyak kekurangan:
Kompleks implementasi
Biasanya, JTA UserTransaction perlu diperoleh dari JNDI. Ini berarti bahwa jika kita menggunakan JTA, kita perlu menggunakan JTA dan JNDI.
JTA sendiri adalah API yang besar.
Biasanya JTA hanya dapat digunakan di lingkungan server aplikasi, jadi menggunakan JTA akan membatasi penggunaan kembali kode.
Meringkaskan
Ada tiga jenis transaksi Java: transaksi JDBC, transaksi JTA (Java Transaction), dan transaksi kontainer. Di antara mereka, penggunaan operasi transaksi JDBC relatif sederhana dan cocok untuk menangani operasi sumber data yang sama. Transaksi JTA relatif kompleks dan dapat digunakan untuk menangani transaksi di beberapa database. Mereka adalah solusi untuk transaksi terdistribusi.
Izinkan saya membicarakannya secara singkat di sini. Meskipun transaksi JTA adalah seperangkat API yang disediakan oleh Java untuk transaksi terdistribusi, platform J2EE yang berbeda memiliki implementasi yang berbeda dan tidak terlalu nyaman untuk digunakan. Oleh karena itu, API yang lebih bertanggung jawab ini umumnya tidak digunakan dalam proyek. Solusi transaksi terdistribusi yang biasa digunakan dalam industri sekarang termasuk jaminan pesan asinkron, TCC, pemberitahuan upaya maksimum, dll.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.