悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)是两种处理并发数据访问的策略。
悲观锁
悲观锁假设在数据处理过程中,数据冲突发生的概率很大,因此在数据处理开始之前,就先将数据锁住,其他线程/事务在这段时间内不能对数据进行修改。
MySQL中的悲观锁
在MySQL中,可以使用SELECT ... FOR UPDATE语句来实现悲观锁。这个语句会锁定查询结果集中的每一行数据,其他事务在锁释放之前不能修改这些行。
案例:假设有一个电商网站,用户在购买商品时需要减少库存。为了避免多个用户同时购买导致库存超卖,可以使用悲观锁在更新库存前锁定库存记录。
Java中的悲观锁
在Java中,悲观锁可以通过synchronized关键字或Lock接口实现。这些机制会阻塞其他线程对共享资源的访问,直到当前线程完成操作并释放锁。
乐观锁
乐观锁假设在数据处理过程中,数据冲突发生的概率很小,因此不会直接锁定数据,而是在数据更新时检查是否有其他线程/事务修改了数据。
MySQL中的乐观锁
在MySQL中,可以使用版本号或时间戳来实现乐观锁。每次更新数据时,都检查版本号或时间戳是否发生变化,如果发生变化则拒绝更新。
更新后,需要判断受影响的行数,如果为0则表示有其他事务已经修改了数据,需要重新读取数据并尝试更新。
Java中的乐观锁
在Java中,可以使用CAS(Compare-And-Swap)操作或版本号等方式实现乐观锁。CAS是一种原子操作,用于比较并替换某个值,如果当前值与预期值相同,则替换为新值。