Rumah  >  Artikel  >  pangkalan data  >  Hubungan antara kunci MySQL, tahap pengasingan transaksi dan aplikasi

Hubungan antara kunci MySQL, tahap pengasingan transaksi dan aplikasi

王林
王林asal
2023-12-21 08:27:471290semak imbas

MySQL 锁的事务隔离级别与应用

Tahap pengasingan transaksi kunci MySQL dan aplikasi
Dalam pangkalan data, tahap pengasingan transaksi merupakan konsep yang sangat penting, yang menentukan tahap pengasingan antara transaksi serentak. MySQL menyediakan empat tahap pengasingan transaksi: BACA TIDAK KOMITED, BACA KOMITED, BACA DIULANG dan BOLEH BERSIRI. Tahap pengasingan transaksi yang berbeza mempunyai strategi penguncian yang berbeza untuk membaca dan menulis data, jadi adalah penting untuk memilih dan menggunakan tahap pengasingan transaksi yang sesuai dalam aplikasi anda dengan betul.

  1. BACA TIDAK KOMITED: Pada tahap ini, urus niaga boleh membaca data tidak komited daripada transaksi lain. Ini bermakna bahawa bacaan kotor mungkin berlaku, iaitu, data yang tidak disahkan dibaca. Tahap ini biasanya tidak disyorkan melainkan anda perlu mendapatkan data masa nyata dalam keadaan khas.
  2. MEMBACA KOMITED: Pada tahap ini, urus niaga hanya boleh membaca data yang diserahkan. Ini mengelakkan masalah bacaan kotor, tetapi boleh menyebabkan masalah bacaan tidak berulang. Bacaan tidak boleh berulang merujuk kepada membaca data yang sama dua kali dalam transaksi yang sama, tetapi hasilnya tidak konsisten. Ini kerana transaksi lain mungkin telah mengemas kini data semasa pelaksanaan transaksi.
  3. BACAAN BOLEH DIULANG: Pada tahap ini, transaksi boleh membaca data yang sama beberapa kali dengan hasil yang konsisten. Ini dicapai dengan mengunci data semasa proses membaca. Pada tahap BACA BOLEH DIULANG, operasi baca akan berkongsi kunci pada baris data yang memenuhi syarat, supaya transaksi lain hanya boleh membaca data tetapi tidak boleh mengubah suai data. Walau bagaimanapun, masalah membaca hantu mungkin masih berlaku. Bacaan hantu merujuk kepada membaca data dalam julat dua kali dalam transaksi yang sama, tetapi hasilnya tidak konsisten. Ini kerana semasa pelaksanaan transaksi, transaksi lain mungkin telah memasukkan atau memadam data yang memenuhi syarat.
  4. BOLEH BERSIRI: Pada tahap ini, urus niaga dilaksanakan secara bersiri. Ini bermakna hanya satu transaksi boleh mengubah suai data pada masa yang sama, dan transaksi lain sedang menunggu kunci dilepaskan. Tahap ini boleh mengelakkan sepenuhnya masalah bacaan kotor, bacaan tidak berulang dan bacaan hantu, tetapi ia juga mempunyai kesan yang besar pada prestasi serentak kerana anda perlu menunggu urus niaga lain melepaskan kunci.

Yang berikut menggunakan contoh kod khusus untuk menunjukkan strategi penguncian di bawah tahap pengasingan transaksi yang berbeza:

Mula-mula buat jadual ujian:

CREATE TABLE test_table (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  age INT
);

Kemudian kami menunjukkan strategi penguncian di bawah tahap pengasingan transaksi yang berbeza:

  1. TANPA KOMITED

    -- 执行事务1
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    START TRANSACTION;
    SELECT * FROM test_table WHERE id = 1;
    
    -- 执行事务2
    START TRANSACTION;
    UPDATE test_table SET age = 20 WHERE id = 1;
    COMMIT;
    
    -- 继续执行事务1
    SELECT * FROM test_table WHERE id = 1;
    COMMIT;

    Dalam contoh ini, transaksi 1 membaca data yang diubah suai tetapi tidak dilakukan oleh transaksi 2.

  2. READ COMMITTED:

    -- 执行事务1
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    START TRANSACTION;
    SELECT * FROM test_table WHERE id = 1;
    
    -- 执行事务2
    START TRANSACTION;
    UPDATE test_table SET age = 20 WHERE id = 1;
    COMMIT;
    
    -- 继续执行事务1
    SELECT * FROM test_table WHERE id = 1;
    COMMIT;

    Dalam contoh ini, transaksi 1 hanya boleh membaca data yang transaksi 2 telah diserahkan.

  3. BACA DIULANG:

    -- 执行事务1
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    START TRANSACTION;
    SELECT * FROM test_table WHERE id = 1;
    
    -- 执行事务2
    START TRANSACTION;
    UPDATE test_table SET age = 20 WHERE id = 1;
    COMMIT;
    
    -- 继续执行事务1
    SELECT * FROM test_table WHERE id = 1;
    COMMIT;

    Dalam contoh ini, transaksi 1 menambah kunci kongsi semasa membaca data, dan transaksi 2 menunggu transaksi 1 melepaskan kunci kongsi sebelum ia boleh dilaksanakan.

  4. SERIALIZABLE:

    -- 执行事务1
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    START TRANSACTION;
    SELECT * FROM test_table WHERE id = 1;
    
    -- 执行事务2
    START TRANSACTION;
    UPDATE test_table SET age = 20 WHERE id = 1;
    COMMIT;
    
    -- 继续执行事务1
    SELECT * FROM test_table WHERE id = 1;
    COMMIT;

    Dalam contoh ini, transaksi 1 menambah kunci kongsi semasa membaca data, dan transaksi 2 menunggu transaksi 1 untuk melepaskan kunci kongsi sebelum ia boleh dilaksanakan.

Melalui contoh kod di atas, kita dapat melihat cara strategi kunci berfungsi di bawah tahap pengasingan transaksi yang berbeza. Dalam pembangunan aplikasi sebenar, adalah sangat perlu untuk memilih tahap pengasingan transaksi yang sesuai, yang boleh dipilih mengikut senario perniagaan tertentu dan keperluan prestasi.

Atas ialah kandungan terperinci Hubungan antara kunci MySQL, tahap pengasingan transaksi dan aplikasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn