Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menggunakan kunci meja dan kunci baris untuk kawalan konkurensi dalam MySQL?

Bagaimana untuk menggunakan kunci meja dan kunci baris untuk kawalan konkurensi dalam MySQL?

WBOY
WBOYasal
2023-07-29 20:39:401311semak imbas

Bagaimana untuk menggunakan kunci meja dan kunci baris untuk kawalan konkurensi dalam MySQL?

Dalam pangkalan data, sering dijumpai berbilang pengguna beroperasi pada data yang sama pada masa yang sama Dalam kes ini, kawalan serentak diperlukan untuk memastikan konsistensi data. MySQL menyediakan dua mekanisme: kunci meja dan kunci baris untuk mencapai kawalan serentak. Artikel ini akan memberi tumpuan kepada cara menggunakan kunci meja dan kunci baris untuk kawalan konkurensi dalam MySQL, dan memberikan contoh kod yang sepadan.

  1. Kunci meja

Kunci meja ialah mekanisme penguncian paling asas dalam MySQL. Ia mengunci seluruh jadual. Apabila pengguna mengemas kini jadual, kunci tulis ditambahkan secara automatik pada jadual dan operasi baca dan tulis pengguna lain di atas meja perlu menunggu kunci dilepaskan. Berikut ialah contoh kod untuk menggunakan kunci jadual:

-- 锁定表
LOCK TABLES table_name WRITE;

-- 进行写操作
UPDATE table_name SET column_name = value WHERE condition;

-- 解锁表
UNLOCK TABLES;

Dalam kod di atas, apabila pengguna melaksanakan perintah LOCK TABLES table_name WRITE, kunci tulis akan ditambahkan pada table_name jadual. Jika pengguna lain perlu mengakses jadual <code>table_name semasa menjalankan operasi baca atau tulis, mereka perlu menunggu sehingga kunci dilepaskan. Selepas menyelesaikan operasi, anda boleh menggunakan perintah UNLOCK TABLES untuk melepaskan kunci. LOCK TABLES table_name WRITE命令时,会对table_name表加上写锁。其他用户在进行读、写操作时,如果需要访问table_name表,就需要等待锁释放。在完成操作后,可以使用UNLOCK TABLES命令来释放锁。

需要注意的是,在使用表锁的时候,所有需要操作的表都需要加锁,这会导致并发性能下降。

  1. 行锁

相比于表锁,行锁给予并发控制更细粒度的控制。对于被锁定的行,其他用户可以继续对其他行进行读和写操作。下面是使用行锁的示例代码:

-- 设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 开启事务
START TRANSACTION;

-- 对行加锁
SELECT column_name FROM table_name WHERE condition FOR UPDATE;

-- 进行写操作
UPDATE table_name SET column_name = value WHERE condition;

-- 提交事务
COMMIT;

上述代码中,我们首先设置了事务的隔离级别为SERIALIZABLE,这是最高级别的事务隔离级别,可以保证最高程度的数据一致性。然后通过SELECT...FOR UPDATE

Perlu diingatkan bahawa apabila menggunakan kunci meja, semua meja yang perlu dikendalikan perlu dikunci, yang akan membawa kepada penurunan prestasi konkurensi.

    Kunci baris

    Berbanding dengan kunci meja, kunci baris memberikan kawalan kawalan konkurensi yang lebih halus. Untuk baris berkunci, pengguna lain boleh terus membaca dan menulis baris lain. Berikut ialah contoh kod menggunakan kunci baris:

    rrreee
      Dalam kod di atas, kami mula-mula menetapkan tahap pengasingan transaksi kepada SERIALIZABLE, iaitu tahap pengasingan transaksi tertinggi dan boleh memastikan tahap ketekalan data tertinggi. Kemudian gunakan pernyataan SELECT...FOR UPDATE untuk mengunci baris yang perlu dikendalikan. Pengguna lain perlu menunggu kunci dilepaskan apabila mereka perlu mengakses baris terkunci.
    1. Perlu diingat bahawa menggunakan kunci baris boleh menyebabkan kebuntuan. Oleh itu, kebutiran dan susunan kunci perlu dipertimbangkan dengan teliti apabila menggunakan kunci baris untuk mengelakkan kebuntuan.
    🎜Ringkasnya, MySQL menyediakan dua mekanisme kawalan serentak: kunci meja dan kunci baris. Kunci meja sesuai untuk operasi pada keseluruhan meja, manakala kunci baris sesuai untuk operasi pada baris separa. Memilih mekanisme kunci yang sesuai berdasarkan keperluan sebenar boleh meningkatkan prestasi konkurensi dan ketekalan data pangkalan data. 🎜🎜Rujukan: 🎜🎜🎜Dokumentasi rasmi MySQL: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk menggunakan kunci meja dan kunci baris untuk kawalan konkurensi dalam MySQL?. 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