数据库行锁和乐观锁疑问

数据库中进行update.delete.insert操作会自动加上行锁,为什么还需要用乐观锁来解决高并发?来自小白的疑问.

在mysql InnoDB中,会对UPDATE、DELETE和INSERT语句自动加锁,以此来保障数据的一致性
但是在高并发场景下就有问题,举个例子

有个商品表goods,剩余库存字段是stock
mysql> select * from goods;

| id | goods | stock |

| 1 | 手机 | 10 |

| 2 | 电脑 | 20 |

A人员买了1个手机--》UPDATE goods SET stock = stock + 1 WHERE id = 1
B人员买了1个手机--》UPDATE goods SET stock = stock + 1 WHERE id = 1
。。。
如果有100个人同时去买这10个手机,就会出现超卖的情况,这显然是不符合常理的

加入乐观锁之后的效果
mysql> select * from goods;

| id | goods | stock | lock |
| 1 | 手机 | 10 | 1 |
| 2 | 电脑 | 20 | 1 |

A买手机之后的操作就是这样
先拿到锁:select lock from goods where id = 1 得到 lock = 1
然后再执行减库存,同时把锁 + 1
update goods set stock = stock - 1, version = version+1
where id = 1 and lock=#{这里就是刚刚拿到的那个锁lock = 1}

这样即使100个人拿到的锁lock 都是1,那么第一个买手机的人成功的人就是把lock + 1 = 2,
那么剩下的99个人在执行update的时候就发现锁变成了lock = 2,而他们当时拿到的锁lock = 1,
这样锁就不一致了,update就无法执行,进行回滚了,这样就解决了高并发场景下防止超卖的情况

乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现,所以有助于解决高并发。
这篇文章比较详细,可以参考看看:https://baike.baidu.com/item/乐观锁/7146502?fr=aladdin

乐观锁和悲观锁,优缺点,自己百度,码字也没有博客说的清楚

行锁需要mysql索引到具体的记录,然后加锁修改。
乐观锁导致mysql直接不回索引到具体的记录,不会去加锁。
个人理解