Penelitian utama dalam artikel ini adalah pengantar dan contoh tingkat isolasi transaksi pegas, sebagai berikut.
Ketika dua transaksi beroperasi pada catatan dalam database yang sama, apa dampaknya di antara mereka? Ini memunculkan konsep tingkat isolasi transaksi. Isolasi database sangat berkaitan dengan kontrol konkurensi. Tingkat isolasi basis data adalah bagian dari asam karakteristik transaksional dari database. Asam, yaitu, atomisitas, konsistensi, isolasi, dan daya tahan. Spring memiliki empat level isolasi transaksi: READ_UNCOMMITTED , READ_COMMITTED , REPEATABLE_READ dan SERIALIZABLE . Yang lainnya adalah tingkat isolasi default dari DEFAULT database, dan mySQL default ke REPEATABLE_READ .
Mari kita lihat secara detail di bawah ini.
Seperti namanya, READ_UNCOMMITTED berarti bahwa satu transaksi dapat membaca catatan transaksi bahwa transaksi lain belum dilakukan. Dengan kata lain, transaksi dapat membaca data yang masih belum berkomitmen oleh transaksi lain. Ini adalah tingkat isolasi terlemah untuk transaksi musim semi. Lihat gambar di bawah ini, Transaksi A dihidupkan dan catatan ditulis. Pada saat ini, Transaksi B membaca data dan membaca catatan ini, tetapi kemudian transaksi A berguling kembali. Oleh karena itu, data yang dibaca oleh transaksi B tidak valid (database dalam keadaan tidak valid). Situasi ini disebut Dirty Read. Selain masalah membaca yang kotor, READ_UNCOMMITTED juga dapat memiliki non-repeatable read (tidak membaca berulang) dan phantom read (Phantom Reading).
Tingkat isolasi READ_COMMITTED menunjukkan bahwa transaksi hanya dapat membaca catatan yang dilakukan dan tidak dapat membaca catatan yang tidak berkomitmen. Dengan kata lain, suatu transaksi hanya dapat membaca data yang dilakukan, dan tidak dapat membaca data yang tidak berkomitmen. Oleh karena itu, situasi baca kotor tidak lagi terjadi, tetapi masalah lain dapat terjadi. Lihat gambar di bawah ini.
Di antara keduanya membaca Transaksi A, Transaksi B memodifikasi catatan itu dan melakukan itu. Oleh karena itu, catatan dibaca sebelum dan sesudah transaksi A tidak konsisten. Masalah ini disebut bacaan yang tidak dapat diulang (tidak dapat dibaca berulang kali). (Catatan dibaca secara tidak konsisten antara dua kali, dan bacaan berulang akan menemukan masalah.)
Selain masalah baca yang tidak dapat diulang, READ_COMMITTED mungkin juga memiliki masalah baca phantom.
REINTABLE_READ berarti bahwa transaksi dapat membaca catatan dari database beberapa kali, dan catatan dibaca beberapa kali adalah sama, sama. Tingkat isolasi ini dapat menghindari masalah bacaan kotor dan bacaan yang tidak dapat diperbaiki, tetapi masalah phantom baca dapat terjadi. Seperti yang ditunjukkan pada gambar di bawah ini.
Transaksi A membaca serangkaian catatan dari database dua kali, di mana, Transaksi B menyisipkan catatan dan mengirimkannya. Ketika transaksi A membaca kedua kalinya, catatan bahwa transaksi B baru saja dimasukkan akan dibaca. Selama transaksi, serangkaian catatan yang dibaca berdasarkan transaksi A dua kali tidak konsisten, dan masalah ini disebut Phantom Read.
Serializable adalah tingkat isolasi terkuat musim semi. Ketika transaksi dieksekusi, itu akan dikunci di semua tingkatan, seperti ketika membaca dan menulis, seolah -olah transaksi dilakukan secara seri, daripada terjadi bersama. Ini mencegah bacaan yang kotor, baca yang tidak dapat diulang dan dibaca hantu, tetapi akan menyebabkan degradasi kinerja.
Mysql default ke REPEATABLE_READ .
Mari kita lihat contoh di bawah ini. Buka transaksi dalam database MySQL, dan jangan berkomitmen. Kemudian transaksi lain membaca catatan.
Di awal, catatan dalam database seperti yang ditunjukkan pada gambar
Selanjutnya, buka transaksi A di database mysql dan masukkan catatan.
Atribut transaksi kelas layanan dalam layanan dikonfigurasi sebagai READ_UNCOMMITTED .
@Transactional (isolation = isolation.read_uncomitted) kelas public classservice {private accountdao accountdao; public accountdao getAccountDao () {return accountdao;} public void setAccountDAo (AccountDao AccountDao) {this.accountDao = AccountDAo (AccountDao AccountDao) {this.accountDao = AccountDao; {accountdao.outmoney (from, money); accountdao.inmoney (ke, money);} public void readAllUser () {List <Account> Accounts = AccountDao.getAllUser (); untuk (Akun Account: Accounts) {System.println (Account);}}}Jalankan kelas tes berikut
Paket com.chris.service; impor statis org.junit.assert.*; impor org.junit.test; impor org.junit.runner.runwith; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.test.test.notation.Autowired; impor org.springframework.test.test.notation.Autowired; ImporcONF.SPRINGAMEWORK.TEST.TEST.TEST. org.springframework.test.context.junit4.springjunit4classrunner; @runwith (springjunit4classrunner.class) @contextConfiguration ("classpath: applicationContext.xml") readallusertest {@Autowired privatecert.xml ") readallusertest {@Autowired privatecerkired; {AccountService.readAllUser ();}}Hasilnya adalah sebagai berikut:
Dapat dilihat bahwa transaksi ini membaca data yang tidak berkomitmen.
Pada saat ini, putar kembali transaksi A dibuka di MySQL.
mysql> rollback;
Jalankan program lagi dan hasilnya
Akun [name = michael, uang = 1000.0]
Akun [name = Jane, uang = 1000.0]
Akun [name = kate, uang = 1000.0]
Di atas adalah semua isi artikel ini tentang pengenalan tingkat isolasi transaksi musim semi dan analisis contoh. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!