乐观锁和悲观锁

【乐观锁和悲观锁】数据库管理系统中的并发控制的任务是确保在多个事务同事存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
乐观锁(Optimistic Locking)

  • 顾名思义,乐观锁表示看待事物比较乐观,默认当A修改某条数据的时候,不会有B来修改这条数据,常表现在提交修改的时候进行锁数据,修改完后解除锁。
    通常情况下配合版本号version进行使用
    例如更新库存操作,从10更新到9:
update sku set qty=9,version=2 where id = 1 and version=1 更新成功则成功,否则抛出错误异常

悲观锁(Pessimistic Lock)
  • 顾名思义,悲观锁表示一个人看待事物比较悲观,默认当A来修改某条数据的时候,会有其他的人来修改,因此常表现在查询的时候就把数据锁定,修改完后解除锁。
    思路:
    1.查询时候加锁----对记录修改之前
    2.加锁失败,抛出错误
    3.加锁成功,修改数据
    4.成功,解锁;失败,抛异常,解锁
$db->autocommit(false); // 开始事务 select * from 表明 where 查询条件 forupdate; // 修改前的查询锁表 update ..........; // 修改 if(修改成功的判断) { $db->commit(); } else { $db->rollback(); }

选择性使用
1.乐观锁并没有真正的加锁,因此效率高一些,但更新失败的几率也会大,并发量高的时候业务失败的几率会大很多。
2.悲观锁是对数据库上锁,高并发会导致数据库卡顿,进而导致服务器卡顿,更新的效率比较低,但业务失败率略低。

    推荐阅读