阻塞、同步、乐观悲观相关概念

[TOC]

阻塞

当某个任务在执行过程中发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足;

非阻塞

当某个任务在执行过程中发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直处于等待状态。

同步

当多个任务要发生时,这些任务必须逐个地进行,一个任务的执行会导致整个流程的暂时等待,这些事件不是并发地执行的;

非同步

当多个任务要发生时,这些任务可以并发地执行,一个任务的执行不会导致整个流程的暂时等待。

乐观锁

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

悲观锁

之所以叫做悲观锁,是因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。

共享锁【Shared lock】又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁【Exclusive lock】又称为写锁,简称X锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据行读取和修改

乐观锁和悲观锁?在数据库里如何实现?

​ 乐观锁,是基于版本号,给每个记录添加一个版本号,当更新数据只有版本号相同才会更新

​ 悲观锁,使用数据库自己的锁,先将自动提交关闭,再开启一个事务,对要更新的数据进行select … for update,可以使得其他也想更新同一个数据的事务阻塞等待。