前几天有人问了我一个问题,说如果数据库某些操作不用事务,那么又需要保持数据的一致性,那么该用什么方法替代事务。我就想到了悲观锁和乐观锁的思想,下面我解释一下在数据库中的悲观锁和乐观锁
1.悲观锁就是把数据库的一些操作,放在事务当中,依赖数据库的隔离级别,实现对数据修改的封锁,这样做数据一致性可以保持的很好,但是效率比较低下,悲观锁从程序的角度上将,就是不在应用程序中做任何保证数据一致性操作,而是把操作放在事务中,把保证数据一致性的任务,交给数据库去做,也就是依赖数据库的锁机制。
2.乐观锁其实从真正意义上并不是锁,是一种代替事务的操作,在应用程序中,如果一个事务不是太复杂,又能容忍数据的更新失败,并且可以尝试重复更新,那么可以考虑用乐观锁来替代事务,即不通过事务来保证数据的一致性,而是通过在程序中的一些操作来保证数据的一致性,防止丢失更新,我们解决的方法就是在数据表中增加一个版本号的字段,版本号可以用整数来做,如果实时性要求不高的话,还可以用时间戳做为版本号,就是每份数据都会维护自己的一个数据版本号,如果更新数据的时候发现数据库中的版本小于我们自己数据的版本,那么就证明数据库中的数据没有我们自己的数据新,那么更新数据库中的版本号为最新的版本号;如果更新数据的时候发现数据库中的版本大于等于我们自己数据的版本就证明,我们自己的数据已经过时,所以返回给程序更新失败的信息,那么我们可以增加版本号的值,如使用时间戳,再一次去尝试更新数据。
悲观锁与乐观锁的区别:
悲观锁是一种排他锁,效率低下,但是数据安全,一般实现在数据库中,不是实现在应用程序中,乐观锁准备说不是一种锁机制,它是应用程序自己加的一种保证数据一致性的机制,所以一般实现在应用程序中,而不是实现在数据库中,并且在hibernate中我们可以显示配置悲观锁乐观锁,当然乐观锁需要在配置文件中配置version属性(用来充当版本号)。