首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql乐观锁和悲观所

基础概念

乐观锁(Optimistic Locking): 乐观锁假设数据在大多数时间不会发生冲突,因此在读取数据时不加锁,只在更新数据时检查数据是否被其他事务修改过。通常通过版本号或时间戳来实现。

悲观锁(Pessimistic Locking): 悲观锁假设数据在大多数时间会发生冲突,因此在读取数据时就加锁,防止其他事务修改数据。悲观锁通常使用数据库提供的锁机制,如行锁、表锁等。

优势

乐观锁的优势

  • 并发性高:因为读取数据时不加锁,多个事务可以同时读取同一数据。
  • 适用于读多写少的场景。

悲观锁的优势

  • 数据一致性高:因为读取数据时就加锁,可以有效防止数据被其他事务修改。
  • 适用于写多读少的场景。

类型

乐观锁的类型

  • 版本号控制:在数据表中增加一个版本号字段,每次更新数据时版本号加1。
  • 时间戳控制:在数据表中增加一个时间戳字段,每次更新数据时更新时间戳。

悲观锁的类型

  • 行锁:锁定某一行数据,其他事务不能修改该行数据。
  • 表锁:锁定整个表,其他事务不能修改表中的任何数据。

应用场景

乐观锁的应用场景

  • 电商系统中的库存更新。
  • 社交网络中的点赞数更新。

悲观锁的应用场景

  • 银行系统中的转账操作。
  • 数据库中的事务处理。

常见问题及解决方法

乐观锁常见问题

  • 更新失败:当多个事务同时尝试更新同一数据时,可能会导致更新失败。解决方法是通过重试机制,在更新失败时重新尝试。
代码语言:txt
复制
-- 示例代码:使用版本号实现乐观锁
-- 假设有一个商品表 product,包含 id, name, stock, version 等字段
-- 更新库存时检查版本号
UPDATE product 
SET stock = stock - 1, version = version + 1 
WHERE id = 1 AND version = current_version;

悲观锁常见问题

  • 死锁:当多个事务互相等待对方释放锁时,可能会导致死锁。解决方法是设置锁的超时时间,并使用死锁检测机制。
代码语言:txt
复制
-- 示例代码:使用行锁实现悲观锁
-- 假设有一个订单表 orders,包含 id, product_id, quantity 等字段
-- 更新订单时加行锁
START TRANSACTION;
SELECT * FROM orders WHERE id = 1 FOR UPDATE;
UPDATE orders SET quantity = quantity - 1 WHERE id = 1;
COMMIT;

参考链接

希望这些信息对你有所帮助!如果有更多问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 数据库技术知识点总结之四——乐观锁与悲观锁

    乐观锁本质上并不属于锁,它只是一种冲突检测机制,但被这样称呼的时间比较长,就被称为乐观锁。乐观锁允许并发的获取内容进行读写,但在提交的时候会进行并发控制。比如 A, B 同时获得了一个数据,而且都要对其进行处理,A 先提交了该条数据,B 后来也要提交该条数据,这时候乐观锁的策略检测到两者发生了冲突,便会拒绝 B 提交的内容,并抛出冲突,交给 B 进行处理。 乐观锁的处理策略,通常是版本控制,或者是时间戳控制(本质与前者相同)。对数据进行一个版本的记录,每次提交后都标上版本号。当提交时的版本号小于等于当前版本号,则抛出异常,待解决冲突后重新执行。 笔者看到这里,就想到了一个很常见的乐观锁——即笔者项目中使用的 SVN 源代码版本控制器。我和同事一起编辑同一个 java 文件,是被允许的,但如果我们两个人提交的内容有冲突,则 SVN 会提示我们冲突,并让我们决定如何解决冲突(采用谁的内容,或者如何合并内容),然后再提交(再提交就是将冲突抛出后再解决的过程)。

    04
    领券