扫码关注公众号
请说明一下锁机制的作用是什么?并且简述一下Hibernate的悲观锁和乐观锁机制是什么?
有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改,这就是所谓的锁机制。Hibernate支持悲观锁和乐观锁两种锁机制。悲观锁,顾名思义悲观的认为在数据处理过程中极有可能存在修改数据的并发事务(包括本系统的其他事务或来自外部系统的事务),于是将处理的数据设置为锁定状态。悲观锁必须依赖数据库本身的锁机制才能真正保证数据访问的排他性,乐观锁,顾名思义,对并发事务持乐观态度(认为对数据的并发操作不会经常性的发生),通过更加宽松的锁机制来解决由于悲观锁排他性的数据访问对系统性能造成的严重影响。最常见的乐观锁是通过数据版本标识来实现的,读取数据时获得数据的版本号,更新数据时将此版本号加1,然后和数据库表对应记录的当前版本号进行比较,如果提交的数据版本号大于数据库中此记录的当前版本号则更新数据,否则认为是过期数据无法更新。Hibernate中通过Session的get()和load()方法从数据库中加载对象时可以通过参数指定使用悲观锁;而乐观锁可以通过给实体类加整型的版本字段再通过XML或@Version注解进行配置。使用乐观锁会增加了一个版本字段,很明显这需要额外的空间来存储这个版本字段,浪费了空间,但是乐观锁会让系统具有更好的并发性,这是对时间的节省。因此乐观锁也是典型的空间换时间的策略。
简单解释什么是锁,什么是乐观锁,乐观锁和悲观锁的区别。
乐观锁:执行操作前认为不会导致冲突,操作数据时,并不进行任何其他的特殊处理(不加锁,在进行更新后,才会去判断是否有冲突。 悲观锁:操作数据时,认为操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作。悲观锁会耗费较多的时间。另外和乐观锁相对的,悲观锁是由数据库自己实现了的,要用时,直接调用数据库的相关语句。
乐观锁和悲观锁使用场景
乐观锁使用场景乐观锁适用于读多写少的情况下,即:读数据多余写数据的时候,可以考虑使用乐观锁。注意:乐观锁本身是不加锁的,只是会在更新数据时候判断数据是否变化。悲观锁使用场景悲观锁适用于写多读少的情况下,即:需要频繁的写数据时候,可以考虑使用悲观锁。
悲观锁实现方式
悲观锁实现,就是通过加锁;可以对代码块加锁,也可以对数据加锁。Java中可以使用synchronized同步代码块。数据库中可以使用排它锁。