首页 > 试题广场 >

请你说说乐观锁和悲观锁

[问答题]
请你说说乐观锁和悲观锁
1.乐观锁:指取数据不上锁,只有在更新数据的时候会检查版本号。 2.悲观所:取数据到更新数据的全过程都上锁。
发表于 2023-02-26 12:04:59 回复(0)
乐观锁:乐观锁总是假设最好的情况,每次去读数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,如果发现冲突了,则返回冲突信息,让用户决定如何处理。像GIT,SVN等代码版本管理器,一般使用乐观锁。乐观锁适用于频繁读数据的场景。 实现方式:使用版本号实现乐观锁 悲观锁:悲观锁总是假设最坏的情况,每次去操作数据的时候都认为别人会修改,所以每次在操作数据前都会上锁。(行锁,表锁,读锁,写锁等) 乐观锁本质上不是一种锁,只是一种并发控制的思想。悲观锁则是一种真正的锁。相比于乐观锁来说,在高并发场景下,悲观锁由于锁的消耗比较大,会导致并发程度降低,还可以增加死锁的可能性。
发表于 2022-10-29 21:46:37 回复(0)
悲观锁认为其他事务访问一定会对数据进行修改,所以每次访问数据前一定要加锁;悲观锁包含(表锁、行锁、读锁、写锁)高并发场景下开销比较大,会影响处理性能。乐观锁认为其他事务访问数据不会更改数据,因此访问数据时不会进行加锁,当发现数据出错时才会采取一定方式补救。乐观锁适用于频繁读的场景。
编辑于 2024-04-08 19:12:26 回复(0)
1. 乐观锁:假设最好的情况,即,每次拿数据的线程都是不会修改数据的,也就是,拿数据的时候,不加锁。所以,拿去数据的时候,其他线程不会被阻塞。在需要更新数据的时候,会进行冲突判断。实现的方式是:版本控制 或者 CAS算法。 应用场景是:SVN、GIT。 =》CAS算法:核心就是比较当前值和期望的旧值,如果相等,就将当前值更新为新值。这个比较和更新的过程是原子的,也就是说,在这个过程中不会有其他线程干扰。因此,如果一个线程通过CAS操作成功地更新了内存位置的值,那么这个值就不会被其他线程再次更新,从而实现了乐观锁的效果。 2. 悲观锁:假设最坏的情况,即,每次读取数据都可能修改数据,需要加锁。所以,在拿取数据的时候,其他线程会被阻塞。实现方式:互斥锁、行级锁、表级锁。应用场景:关系型数据库的锁机制。
发表于 2023-11-08 22:20:04 回复(0)
悲观锁:在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对其数据进行操作,直到前面一个人把锁释放后下一个人数据加锁才可对数据进行加锁,然后才可以对数据进行操作
发表于 2022-08-28 17:30:51 回复(0)