高併發情況下扣除庫存鎖表情況

2021-09-11 11:25:01 字數 1465 閱讀 1529

[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等工具的直接生成語句 僅耗時較長的查詢做優化 優化資料庫結構,多做索引,提高查...