悲观锁和乐观锁

系统管理员 2022-05-12 04:14 453阅读 0赞

1、悲观锁:

顾名思义,每次读取数据库的数据时,都假设会被它人修改,因此要加锁将数据锁住,防止被修改。

可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

2、乐观锁

总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断 其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。

3、悲观锁实现

悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

4、乐观锁实现

乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳,然后按照如下方式实现:

  1. 1. SELECT data AS old_data, version AS old_version FROM …;
  2. 2. 根据获取的数据进行业务操作,得到new_datanew_version
  3. 3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
  4. if (updated row > 0) {
  5. // 乐观锁获取成功,操作完成
  6. } else {
  7. // 乐观锁获取失败,回滚并重试
  8. }

发表评论

表情:
评论列表 (有 0 条评论,453人围观)

还没有评论,来说两句吧...

相关阅读

    相关 悲观乐观

    悲观锁 即对一切数据修改持悲观态度,认为每次数据修改都会发生数据冲突,所以在一个线程对某一个数据进行读写操作后则直接为被读取的数据上锁,直至完成读写操作并更新数据;  

    相关 乐观悲观

    这个问题经常在面试中被问到,在此做个记录! 一.乐观锁 ​ 乐观锁就是总是认为事情总是朝着好的方向发展,总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不

    相关 乐观悲观

        乐观锁     乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以

    相关 悲观乐观

    锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希

    相关 乐观悲观

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

    相关 乐观悲观

    乐观锁和悲观锁主要用在数据库的并发访问控制上面 悲观锁:每次进行数据访问时都认为会发生冲突,因此屏蔽任何会影响数据完整性的操作。关系型数据库里边就用到了很多这种锁机制,比如行

    相关 悲观乐观

    1、悲观锁:    顾名思义,每次读取数据库的数据时,都假设会被它人修改,因此要加锁将数据锁住,防止被修改。   可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加

    相关 悲观乐观

    这是一篇介绍悲观锁和乐观锁的入门文章。旨在让那些不了解悲观锁和乐观锁的小白们弄清楚什么是悲观锁,什么是乐观锁。不同于其他文章,本文会配上相应的图解让大家更容易理解。通过该文,你