mysql - InnoDB中的鎖
問題描述
問題解答
回答1:------- TRX HAS BEEN WAITING 28 SEC FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 6 page no 4 n bits 80 index idx_a of table `test`.`t` trx id 637972 lock_mode X locks gap before rec insert intention waitingRecord lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 32 0: len 4; hex 8000000b; asc ;; 1: len 6; hex 000000000414; asc ;;
這里說的很清楚啊 lock_mode X意味著是排它鎖 gap代表是區間鎖也就是說在insert之前該表加入了區間排他鎖,為什么呢?因為之前執行的這句delete from t where a = 11;會在(negative infinity,11]這個區間加上排他鎖,為什么是排他鎖而不是Record Lock呢,因為你這里的a并非唯一索引,只是一個普通的索引,具體的看http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
回答2:mysql默認的會話隔離級別是repeated read,會產生更多的gap鎖,如果可以接受幻讀,可以考慮降為read commit級別,減少鎖沖突的概率。
相關文章:
1. 數組按鍵值封裝!2. Docker for Mac 創建的dnsmasq容器連不上/不工作的問題3. docker不顯示端口映射呢?4. python - flask _sqlalchemy 能否用中文作為索引條件5. java - 阿里的開發手冊中為什么禁用map來作為查詢的接受類?6. python3.x - git bash如何運行.bat文件?7. javascript - ES6規范下 repeat 函數報錯 Invalid count value8. html5 - 使用echarts中的圖表 一個頁面導入了好幾個js圖表 實現echarts圖表隨著瀏覽器窗口變化而變化時出現了問題9. javascript - webpack中alias配置中的“@”是什么意思?10. javascript - 為什么創建多行多列的表格最后只有一行內有表格
