关于乐观锁与悲观锁的理解

悲观锁:不相信其他人不会修改,传统的关系型数据库里边就用到了很多这种锁机制,如mysql, 每次查询、修改数据操作之前就会上锁,整个数据处理过程中,将数据处于锁定状态,自己更新数据后再释放锁,可以有效防止库存冲突问题

乐观锁:相信其他人不会修改,所以查询、修改数据库时不会上锁,所以再数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回错误的信息,让用户决定如何 去做

乐观锁作用举例:

  1. 电商网站库存,当多用户并发修改同一条记录时,可定是后提交的用户将覆盖前者提交的结果,这个时候,可以使用加乐观锁的机制去解决高并发的问题

  2. Reids 的并发竞争问题解决方案,使用乐观锁方式进行解决,成本低,非阻塞,性能较高、

乐观锁的业务流程

  • 事务开始

    1. 查询、修改数据表

    2. 对数据库 操作

  • 事务提交 释放锁

  • 优点与不足

    扫描二维码关注公众号,回复: 1925211 查看本文章
    1. 在数据提交的时候才去锁定,所以不会产生任何的锁和死锁,

    2. 读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

    3. 当两个不同的事务同时读取到一条数据并进行修改时,就会报错,解决方案,尽量从业务方面减小事务块,事务块越大,由乐观锁引起的问题的概率就越大

悲观锁的业务流程

  • 事务开始

    1. 查询、修改数据表之前 加锁

    2. 对数据库 操作

  • 事务提交(检测、返回冲突)

  • 优点与不足

    1. 先取锁再访问 为数据处理的安全性提供了保证

    2. 效率方面,让数据库产生了额外的开销 ,增加了死锁的机会

    3. 对于只读事务处理,不会产生并发冲突,加悲观锁,指挥增加系统的负载,降低了并行性

猜你喜欢

转载自blog.csdn.net/xiaochendefendoushi/article/details/80900834