Transaksi Jedis
Ketika kami menggunakan JDBC untuk terhubung ke MySQL, kami perlu memulai transaksi sebelum menjalankan pernyataan SQL; Di MyBatis, kita juga perlu menggunakan opensession () untuk mendapatkan objek transaksi sesi untuk melakukan eksekusi SQL, kueri, dan operasi lainnya. Ketika operasi kami pada database selesai, objek transaksi bertanggung jawab untuk menutup koneksi database.
Objek transaksi digunakan untuk mengelola dan melakukan berbagai operasi basis data. Ini dapat menghidupkan dan menutup koneksi basis data, menjalankan pernyataan SQL, dan memutar kembali operasi kesalahan.
Redis kami juga memiliki objek manajemen transaksi, yang terletak di bawah redis.clients.jedis.transaction.
Kode Terkait untuk Transaksi JEDIS:
paket cn.com.redis; impor redis.clients.jedis.jedis; impor redis.clients.jedis.transaction; test kelas publik7 {public static void main (string [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Transaksi transaksi = jedis.multi (); // mengembalikan objek kontrol transaksi // preload operasi yang akan dieksekusi dalam objek transaksi di muka transaksi.set ("k4", "v4"); transaction.set ("k5", "v5"); transaction.exec (); // eksekusi}}Mari kita periksa Redis:
Menemukan bahwa data telah ditambahkan
Kami mengubah nilai K4 dan nilai K5 menjadi "V44" dan "V55", dan kemudian menambahkan pernyataan Transaction.discard () setelah pernyataan Transaction.exec ():
paket cn.com.redis; impor redis.clients.jedis.jedis; impor redis.clients.jedis.transaction; test kelas publik7 {public static void main (string [] args) {jedis jedis = new jedis ("192.168.248.129", 6379); Transaksi transaksi = jedis.multi (); // mengembalikan objek kontrol transaksi // preload operasi yang akan dieksekusi dalam objek transaksi di muka transaksi.set ("k4", "v44"); transaction.set ("k5", "v55"); transaction.discard (); // rolling kembali}}Anda akan menemukan bahwa operasi penyisipan data digulung kembali, dan dua nilai di redis belum diubah:
Kami mensimulasikan transaksi yang menggesek kartu kredit sekali, menggunakan transaksi Redis untuk menangani beberapa logika:
paket cn.com.redis; impor redis.clients.jedis.jedis; impor redis.clients.jedis.transaction; TestTransaction kelas publik {// Simulasi konsumsi kartu kredit dan pembayaran public static void main (string [] args) {testTransaction t = testTransaction baru (); boolean retvalue = t.transmethod (100); if (retValue) {System.out.println ("Keberhasilan penggunaan konsumsi kartu kredit!"); } else {System.out.println ("Gagal menggunakan konsumsi kartu kredit!"); }} /*** Dalam istilah awam, perintah arloji adalah untuk menandai kunci. Jika kunci ditandai, * jika kunci dimodifikasi oleh orang lain sebelum mengirimkan transaksi, transaksi akan gagal. Situasi ini biasanya dapat dicoba lagi dalam program*. * * Pertama, tandai saldo, dan kemudian periksa apakah saldo sudah cukup. Jika tidak mencukupi, batalkan tanda tanpa pengurangan; * Jika cukup, mulailah transaksi untuk operasi pembaruan. * Jika saldo kunci dimodifikasi oleh orang lain selama periode ini, kesalahan akan dilaporkan saat mengirimkan transaksi (EXEC). * Jenis kesalahan ini biasanya dapat ditangkap dalam program dan kemudian dieksekusi lagi sampai berhasil. * */ private boolean transmethod (jumlah int) {system.out.println ("Anda menggunakan kartu kredit untuk memajukan pembayaran"+jumlah+"yuan"); Jedis jedis = jedis baru ("192.168.248.129", 6379); int neraca = 1000; // saldo yang tersedia int hutang; // dari int amttoSubtract = jumlah; // jumlah penyikat nyata jedis.set ("saldo", string.valueof (saldo)); jedis.watch ("balance"); //jedis.set("BALANCE "," 1100 "); // Kalimat ini seharusnya tidak muncul. Untuk mensimulasikan program lain, entri telah dimodifikasi. saldo = integer.parseint (jedis.get ("balance")); if (balance <amttoSubtract) {// saldo yang tersedia kurang dari jumlah yang disikat, transaksi ditolak jedis.unwatch (); System.out.println ("Saldo yang tersedia tidak cukup!"); mengembalikan false; } else {// Ketika saldo yang tersedia cukup, lalu jalankan System Operasi Deduksi.out.println ("Transaksi deduksi memulai eksekusi ..."); Transaksi transaksi = jedis.multi (); transaction.decrby ("saldo", amttoSubtract); // saldo dikurangi jumlah uang dalam transaksi amttosubtract.incrby ("utang", amttosubtract); // hutang kartu kredit; jumlah uang saldo. hutang = integer.parseint (jedis.get ("hutang")); System.out.println ("Eksekusi Transaksi Transaksi Hutang berakhir ..."); System.out.println ("Saldo yang tersedia:"+Balance); System.out.println ("Anda saat ini berutang uang:"+utang); Kembali Benar; }}}Kode ini mensimulasikan pengguna yang menggunakan kartu kredit untuk menggesek 100 yuan. Pada saat ini, saldo kartu kredit yang tersedia harus dikurangi 100 yuan, dan utang 100 yuan harus ditingkatkan.
Hasil Menjalankan:
Hasil Redis:
Buktikan bahwa operasi kami berhasil.
Perintah arloji ditambahkan untuk mencegah operasi lain mengganggu transaksi atau mempengaruhi hasil perhitungan transaksi selama eksekusi transaksi, yang mengakibatkan situasi abnormal seperti "pembacaan ilusi" dan "data kotor". Perintah Watch membuat kunci. Setelah ditemukan bahwa kunci telah dimodifikasi oleh orang lain selama eksekusi, transaksi akan gagal. Jenis kesalahan ini biasanya dapat ditangkap dalam program dan kemudian dieksekusi lagi sampai berhasil. Oleh karena itu, perintah arloji dapat memastikan sinkronisasi data.
Untuk membuktikan tujuan perintah Watch, kami melepaskan jedis.set ("Balance", "1100"); Komentar dalam kode di atas, dan kemudian metode transmethod melempar pengecualian yang terputus: melempar ExterruptedException, metode utama menangkap pengecualian yang terganggu, dan kemudian kotak peringatan yang sesuai muncul.
paket cn.com.redis; impor java.util.list; impor redis.clients.jedis.jedis; impor redis.clients.jedis.transaction; TestTransaction kelas publik {// Simulasi konsumsi kartu kredit dan pembayaran public static void main (string [] args) {testTransaction t = testTransaction baru (); retvalue boolean = false; Boolean terputus = false; coba {retValue = t.transmethod (100); } catch (InterruptedException e) {interrupted = true; System.out.println ("Transaksi terganggu, tolong jalankan lagi!"); } akhirnya {if (retValue) {System.out.println ("Keberhasilan penggunaan kartu kredit!"); } else {if (! interrupted) {System.out.println ("Gagal menggunakan kartu kredit! Saldo tidak cukup!"); }}}}} /*** Dalam istilah sederhana, perintah Watch adalah untuk menandai kunci. Jika kunci ditandai, * jika kunci dimodifikasi oleh orang lain sebelum mengirimkan transaksi, transaksi akan gagal. Situasi ini biasanya dapat dicoba lagi dalam program*. * * Pertama, tandai saldo, dan kemudian periksa apakah saldo sudah cukup. Jika tidak mencukupi, batalkan tanda tanpa pengurangan; * Jika cukup, mulailah transaksi untuk operasi pembaruan. * Jika saldo kunci dimodifikasi oleh orang lain selama periode ini, kesalahan akan dilaporkan saat mengirimkan transaksi (EXEC). * Jenis kesalahan ini biasanya dapat ditangkap dalam program dan kemudian dieksekusi lagi sampai berhasil. * */ private boolean transmethod (jumlah int) melempar interruptedException {system.out.println ("Anda menggunakan kartu kredit Anda untuk memajukan pembayaran"+Jumlah+"yuan"); Jedis jedis = jedis baru ("192.168.248.129", 6379); int neraca = 1000; // saldo yang tersedia int hutang; // jumlah absolut int amttoSubtract = jumlah; // batas sikat nyata jedis.set ("saldo", string.valueof (saldo)); jedis.watch ("balance"); jedis.set ("balance", "1100"); // kalimat ini tidak boleh muncul. Untuk mensimulasikan program lain, entri telah dimodifikasi. saldo = integer.parseint (jedis.get ("balance")); if (balance <amttoSubtract) {// saldo yang tersedia kurang dari jumlah yang disikat, transaksi ditolak jedis.unwatch (); System.out.println ("Saldo yang tersedia tidak cukup!"); mengembalikan false; } else {// Ketika saldo yang tersedia cukup, lalu jalankan System Operasi Deduksi.out.println ("Transaksi deduksi memulai eksekusi ..."); Transaksi transaksi = jedis.multi (); transaction.decrby ("saldo", amttosubtract); // saldo dikurangi uang aMttoSubtract transaction.incrby ("utang", amttosubtract); // hutang kartu kredit meningkatkan uang dari transaksi (objek = no hasil = transaksi. telah dimodifikasi selama eksekusi system.out.println ("Mengurangi interupsi eksekusi transaksi ..."); Lempar interupsi baru (); } else {// pengiriman transaksi Saldo Sukses = integer.parseint (jedis.get ("balance")); hutang = integer.parseint (jedis.get ("hutang")); System.out.println ("Mengurangi Eksekusi Transaksi Akhir ..."); System.out.println ("Saldo yang tersedia:"+Balance); System.out.println ("Anda saat ini berutang uang:"+utang); Kembali Benar; }}}}}Jalankan lagi dan lihat efeknya:
Ini menunjukkan bahwa jika data dimodifikasi setelah perintah Watch dieksekusi dan sebelum transaksi diajukan, eksekusi transaksi tidak akan berhasil, yang memastikan keamanan data.
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.