[toc]
## 1. 鎖表情景:查詢條件沒有索引時
總結起來就是兩個嚴重問題:
1. 扣庫存時沒走索引
2. 在事務中,調第三方介面
```sql
create table gap(
id int,
age int,
primary key(id)
)select * from gap;
insert into `test`.`gap`(`id`, `age`) values (1, 13);
insert into `test`.`gap`(`id`, `age`) values (2, 24);
show engine innodb status;
show status like '%lock%';
show open tables where in_use > 0;-- 查詢是否鎖表,in_use = 1表示加鎖,0表示未加鎖
show processlist;-- 查詢到相對應的程序
-- 檢視正在鎖的事務
select * from information_schema.innodb_locks;
-- 檢視等待鎖的事務
select * from information_schema.innodb_lock_waits;
-- 事務1
start transaction;
update gap set age = 25 where age = 24;
-- 事務2
start transaction;
update gap set age = 14 where age = 13;
-- 這一行會等待,age沒有索引時,會導致鎖表
-- 檢視正在鎖的事務,為啥不是鎖表而是record呢,明明是鎖表呀
-- 19988193:890:3:2 19988193 x record `test`.`gap` primary 890 3 2 1
-- 19988194:890:3:2 19988194 x record `test`.`gap` primary 890 3 2 1
```## 2. 解決
通過redis實現庫存扣減,而不是通過db層來控制庫存,減少db的壓力。
## 3. 參考:
> **gap lock在innodb的唯一作用就是防止其他事務的插入操作,以此防止幻讀的發生。**
>
> **innodb自動使用間隙鎖的條件:**
>
> **(1)必須在repeatable read級別下**
>
> **(2)檢索條件必須有索引(沒有索引的話,mysql會全表掃瞄,那樣會鎖定整張表所有的記錄,包括不存在的記錄,此時其他事務不能修改不能刪除不能新增)**
併發情況下synchronized死鎖
存在缺陷的 public class datapropertyidandnamerepositoryimpl integer standardid 0 mappropertyidmap propertyidlocalcache.get dataid if propertyidmap null ret...
併發情況下synchronized死鎖
存在缺陷的 public class datapropertyidandnamerepositoryimpl integer standardid 0 mappropertyidmap propertyidlocalcache.get dataid if propertyidmap null ret...
高併發情況下 如何支撐大量的請求
幾點需要注意 盡量使用快取,包括使用者快取,資訊快取等,多花點記憶體來做快取,可以大量減少與資料庫的互動,提高效能。用jprofiler等工具找出效能瓶頸,減少額外的開銷。優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句 僅耗時較長的查詢做優化 優化資料庫結構,多做索引,提高查...