Artikel ini membawakan anda pengetahuan yang berkaitan tentang MySQL terutamanya tentang cara MySQL mengemas kini kebuntuan.
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:
Memandangkan indeks kunci bukan utama digunakan, anda perlu mendapatkan kunci peringkat baris terlebih dahulu pada idx_1
Segera kemas kini berdasarkan kunci utama, jadi anda perlu mendapatkan kunci peringkat baris pada kunci primer; kemas kini selesai, serahkan dan lepaskan semua kunci.
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.
Penyelesaian:
Dapatkan kunci utama rekod yang perlu dikemas kini dahuluselect id from user_item where user_id=? and item_id=?
update user_item set status=? where id=? and user_id=?
Pembelajaran yang disyorkan: "
Tutorial Video MySQLAtas 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!