乐观锁,悲观锁,事务

来源:互联网 发布:android安装 mysql 编辑:程序博客网 时间:2024/05/17 03:14

乐观锁,悲观锁,事务

感觉这些东西好基础,好抽象,对不对?还是来和我一起弄明白吧。

     悲观锁和乐观锁本是数据库的概念,但是其实DB与应用并没有本质区别,数据库设计所是为了事物,而事物的核心是并发和锁,如今的环境下,哪个系统不需要支持成千上万的并发量,所以一个合格的系统必须支持事物,通常我们所说的事物指的是针对共享数据进行读写的软件事物。

     锁是一种作为并发访问共享数据时,保证数据一致性的工具。锁有多种实现方式.根据性质来分锁分为很多种,例如,自旋锁,阻塞锁,读写锁,互斥锁等等.从思想上分)乐观锁和悲观锁.

 

悲观锁:
      悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。
      个人理解就是悲观锁对修改数据这件事情持悲观状态,所以他必须要独占数据,让数据修改的过程中只有一个人在操作这个数据(原子操作).
      举例:传统型数据库中如表锁,行锁都是操作之前先上锁,都属于悲观锁,又如jdksynchronized关键字也是悲观锁的一种.

乐观锁:
      乐观锁(Optimistic Locking)相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制.顾名思义就是对待数据是否被更改这件事持乐观态度,每次去查询数据的时候认为数据不会被修改,所以不会上锁,但是在更新的时候会去判断此数据是否被修改,判断的依据就是加在这个数据上面的某个状态,比如版本号,时间戳等最后发现不行时就回滚。
      举例: redis中事务使用了乐观锁,mysql中有mvcc机制也是乐观锁的一种,jdk中各种原子类(cas实现).

总结:

        悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。而如果使用乐观锁的话,可以间接减少事物的长度,并发度相对高些。

       一般来说只有并发量很高冲突非常严重的系统才需要悲观锁,否则的话就使用乐观锁。如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。

 

 

0 0
原创粉丝点击