Rumah  >  Artikel  >  pangkalan data  >  Artikel yang menerangkan secara terperinci bagaimana MySQL mengemas kini kebuntuan dalam kelompok

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

藏色散人
藏色散人ke hadapan
2023-04-13 16:32:371526semak imbas

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

Pernyataan SQL adalah seperti berikut:

update user_item set status=1 where user_id=? and item_id=?

Analisis sebab:

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

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

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=?
  2. Batch Ulang langkah pertama dan kedua dalam gelung
     update user_item set status=? where id=? and user_id=?
  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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:indeks mysql apa maksudnyaArtikel seterusnya:indeks mysql apa maksudnya