Rumah > Artikel > pangkalan data > Apakah tahap pengasingan transaksi mysql?
Terdapat empat tahap pengasingan transaksi: 1. Baca Tidak Komited (baca tidak komited), yang membenarkan pembacaan perubahan data tidak komited, yang boleh menyebabkan bacaan kotor, bacaan tidak boleh berulang dan bacaan hantu. 2. Read Committed (Read Committed) membenarkan membaca data yang telah diserahkan oleh transaksi serentak, yang boleh mengelakkan bacaan kotor, tetapi boleh menyebabkan bacaan tidak boleh berulang dan hantu. 3. Bacaan Boleh Ulang (repeatable read), hasil bacaan berbilang medan yang sama adalah konsisten. 4. Boleh bersiri (serializable).
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Transaksi ialah satu set operasi logik, sama ada kesemuanya dilaksanakan atau tiada satu pun daripadanya dilaksanakan.
Berangan yang paling klasik dan sering disebut dalam perniagaan ialah pindahan wang melalui bank. Sebagai contoh, jika Xiao Ming ingin memindahkan 1,000 yuan kepada Xiao Hong, pemindahan ini akan melibatkan dua operasi utama: mengurangkan baki Xiao Ming sebanyak 1,000 yuan dan mengurangkan baki Xiao Hong sebanyak 1,000 yuan. Jika ralat tiba-tiba berlaku antara kedua-dua operasi ini, menyebabkan baki Xiao Ming berkurangan tetapi baki Xiao Hong tidak meningkat, keadaan ini pastinya tidak dibenarkan. Urus niaga adalah untuk memastikan kedua-dua operasi utama ini sama ada berjaya atau tidak berjaya.
Dalam aplikasi biasa, berbilang transaksi berjalan serentak, selalunya Memanipulasi data yang sama untuk menyelesaikan tugas masing-masing (berbilang pengguna yang beroperasi pada data yang sama). Walaupun konkurensi adalah perlu, ia mungkin menyebabkan masalah berikut:
A=20
, transaksi 2 juga membaca A=20
, transaksi 1 mengubah suai A=A-1
, transaksi 2 juga mengubah suai A=A-1
, keputusan akhir semuanya 19
, tetapi transaksi 1 mengubah suai Rekod hilang. Tumpuan bacaan tidak berulang adalah pengubahsuaian, manakala fokus bacaan hantu adalah penambahan atau pemadaman.
Chestnut 1 (syarat yang sama, data yang anda baca akan berbeza apabila anda membacanya semula): En.A dalam transaksi 1 terbaca gajinya 1000. Operasi belum tamat lagi, transaksi En. . B dalam 2 ubah suai gaji Encik A kepada 2000. Bila Encik A baca semula gajinya, jadi 2000. Ini bacaan yang tidak boleh diulang.
Chestnut 2 (syarat yang sama, bilangan rekod yang dibaca untuk kali pertama dan kedua adalah berbeza): Jika terdapat 4 orang dalam jadual gaji dengan gaji lebih daripada 3,000, transaksi 1 berbunyi semua Untuk orang dengan gaji lebih daripada 3,000, sejumlah 4 rekod telah disoal Ini kerana transaksi 2 menanyakan satu lagi rekod dengan gaji lebih daripada 3,000 dibaca semula dan mendapati 5 rekod.
Standard SQL mentakrifkan empat tahap pengasingan:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读取未提交 | √ | √ | √ |
读取已提交 | × | √ | √ |
可重复读 | × | × | √ |
可串行化 | × | × | × |
MySQL InnoDB
Tahap pengasingan urus niaga lalai bagi enjin storan ialah BACA DIULANG , yang boleh dilihat melalui perintah select @@tx_isolation;
pernyataan MySQL 8.0
Penyataan ditukar kepada SELECT @@transaction_isolation;
mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+
MySQL InnoDB
Pembacaan enjin penyimpanan tidak dapat mengelakkan bacaan hantu, dan aplikasi perlu menggunakan bacaan terkunci untuk memastikan ini. > . Next-Key Locks
Oleh kerana semakin rendah tahap pengasingan, semakin sedikit kunci yang diminta oleh urus niaga, jadi tahap pengasingan kebanyakan sistem pangkalan data ialah
, enjin storan Gunakan REPEATABLE-READ (boleh dibaca semula) InnoDB
secara lalai tanpa sebarang penalti prestasi.
Boleh BersiriInnoDB
dalam kes transaksi yang diedarkan. ? Kembangkan (kandungan berikut dipetik daripada Bab 7.7 "MySQL Technology Insider: InnoDB Storage Engine (2nd Edition)"):
akan melaksanakan operasi MySQL
serta-merta. Anda boleh menggunakan arahan SQL
untuk memulakan transaksi. COMMIT
START TRANSACTION
Kami boleh menetapkan tahap pengasingan transaksi melalui arahan berikut.
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
START TRANSACTION | BEGIN
COMMIT
ROLLBACK
skrip sql 1 Apabila menanyakan rekod dengan gaji 500 buat kali pertama, hanya ada satu rekod, dan skrip sql 2 sisipan Rekod dengan gaji 500 telah diperolehi Selepas penyerahan, skrip sql 1 menggunakan pertanyaan baca semasa sekali lagi dalam transaksi yang sama dan mendapati dua rekod dengan gaji 500 muncul adalah bacaan hantu.
Bacaan hantu dan bacaan tidak berulang adalah agak serupa, tetapi fokus bacaan tidak berulang adalah pengubahsuaian, manakala fokus bacaan hantu ialah penambahan atau pemadaman.
Kaedah untuk menyelesaikan bacaan hantu
Laraskan tahap pengasingan transaksi kepadaSERIALIZABLE
Pada tahap transaksi baca berulang, tambah kunci jadual pada jadual dalam operasi transaksi. Next-Key Locks
adalah bersamaan dengan kunci baris + kunci celahtutorial video mysql[Cadangan berkaitan:
Next-Key Locks
Atas ialah kandungan terperinci Apakah tahap pengasingan transaksi mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!