悲观锁和乐观锁

          前几天有人问了我一个问题。说假设数据库某些操作不用事务,那么又须要保持数据的一致性,那么该用什么方法替代事务。我就想到了悲观锁和乐观锁的思想,以下我解释一下在数据库中的悲观锁和乐观锁

        1.悲观锁就是把数据库的一些操作,放在事务其中,依赖数据库的隔离级别,实现对数据改动的封锁。这样做数据一致性能够保持的非常好。可是效率比較低下,悲观锁从程序的角度上将。就是不在应用程序中做不论什么保证数据一致性操作,而是把操作放在事务中,把保证数据一致性的任务,交给数据库去做,也就是依赖数据库的锁机制。

        2.乐观锁事实上从真正意义上并非锁,是一种取代事务的操作。在应用程序中,假设一个事务不是太复杂,又能容忍数据的更新失败,而且能够尝试反复更新,那么能够考虑用乐观锁来替代事务,即不通过事务来保证数据的一致性,而是通过在程序中的一些操作来保证数据的一致性,防止丢失更新,我们解决办法就是在数据表中添加一个版本号号的字段,版本号号能够用整数来做,假设实时性要求不高的话,还能够用时间戳做为版本号号,就是每份数据都会维护自己的一个数据版本号号。假设更新数据的时候发现数据库中的版本号小于我们自己数据的版本号,那么就证明数据库中的数据没有我们自己的数据新,那么更新数据库中的版本号号为最新的版本号号;假设更新数据的时候发现数据库中的版本号大于等于我们自己数据的版本号就证明,我们自己的数据已经过时,所以返回给程序更新失败的信息,那么我们能够添加版本号号的值,如使用时间戳。再一次去尝试更新数据。


      悲观锁与乐观锁的差别:

         悲观锁是一种排他锁,效率低下,可是数据安全。一般实如今数据库中。不是实如今应用程序中,乐观锁准备说不是一种锁机制,它是应用程序自己加的一种保证数据一致性的机制。所以一般实如今应用程序中,而不是实如今数据库中。而且在hibernate中我们能够显示配置悲观锁乐观锁,当然乐观锁须要在配置文件里配置version属性(用来充当版本)。

原文地址:https://www.cnblogs.com/blfbuaa/p/7020112.html