Artikel yang menerangkan secara terperinci bagaimana MySQL mengemas kini kebuntuan dalam kelompok

藏色散人
Lepaskan: 2023-04-13 16:32:37
ke hadapan
1601 orang telah melayarinya

Artikel ini membawakan anda pengetahuan yang berkaitan tentang MySQL terutamanya tentang cara MySQL mengemas kini kebuntuan.

Artikel yang menerangkan secara terperinci bagaimana MySQL mengemas kini kebuntuan dalam kelompok

Struktur jadual adalah seperti berikut:

CREATE TABLE `user_item` (
  `id` BIGINT(20) NOT NULL,
  `user_id` BIGINT(20) NOT NULL,
  `item_id` BIGINT(20) NOT NULL,
  `status` TINYINT(4) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_1` (`user_id`,`item_id`,`status`)) ENGINE=INNODB DEFAULT CHARSET=utf-8
Salin selepas log masuk

Pernyataan SQL adalah seperti berikut:

update user_item set status=1 where user_id=? and item_id=?
Salin selepas log masuk

Analisis sebab:

 mysql的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新时采用的是行级锁。这里采用的是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。前面提到行级锁必须建立在索引的基础,这条更新语句用到了索引idx_1,所以这里肯定会加上行级锁。

 行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引。
Salin selepas log masuk

Pernyataan kemas kini ini akan melaksanakan langkah berikut:

  1. Memandangkan indeks kunci bukan utama digunakan, anda perlu mendapatkan kunci peringkat baris terlebih dahulu pada idx_1

  2. Segera kemas kini berdasarkan kunci utama, jadi anda perlu mendapatkan kunci peringkat baris pada kunci primer; kemas kini selesai, serahkan dan lepaskan semua kunci.

  3. Jika pernyataan tiba-tiba dimasukkan antara langkah 1 dan 2: kemas kini user_item…..where id=? dan user_id=?, pernyataan ini akan mengunci indeks kunci utama dahulu, dan kemudian Kunci idx_1.

  4. Timbul situasi yang menyakitkan. Satu pernyataan memperoleh kunci pada idx_1 dan menunggu kunci pada indeks kunci utama; kebuntuan.

Penyelesaian:

Dapatkan kunci utama rekod yang perlu dikemas kini dahulu

    Kemas kini satu persatu
  1. select id from user_item where user_id=? and item_id=?
    Salin selepas log masuk
  2. Batch Ulang langkah pertama dan kedua dalam gelung
     update user_item set status=? where id=? and user_id=?
    Salin selepas log masuk
  3. Pembelajaran yang disyorkan: "

    Tutorial Video MySQL
  4. "

Atas ialah kandungan terperinci Artikel yang menerangkan secara terperinci bagaimana MySQL mengemas kini kebuntuan dalam kelompok. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan