最近在做web商城的购物车、订单和库存涉及到了事务及数据库锁的机制,刚刚看到数据库级别的锁机制,暂且先做个记录
业务场景:当用户下单时,需要减少库存。减少库存操作需要考虑,用户下单的并发,在没有锁及事务的情况下,可能会发生数据错误。
数据库版本 mysql
悲观锁:select from table where 条件 for update
锁表条件:**在事务开始执行查询sql后,事务提交之前,**对表记录上锁。在加锁状态,其他线程再执行 select from table where 条件 for update 为阻塞状态。
在事务开始后切提交前是个重点,切记!
乐观锁:对表数据加上version字段,更新记录前,检查version,若version相同,则更新记录并更新version。不同则回滚操作。
另:mysql 的InnoDB引擎 使用 for update 是根据查询索引来锁记录的,如果你的查询中的索引可以关联到多条,那么就会锁多条。
资料:
https://blog.csdn.net/G_Platinum/article/details/82931513