乐观锁和悲观锁机制

对于多数应用程序,可以优先考虑把数据库系统的隔离级别设置为Read Commited,这样做能够避免脏读,即避免读到未提交的数据,同时具有比较好的并发性能。这样做会导致不可重复读,幻读等这些并发问题,可以采用悲观锁和乐观锁来控制。MySQL当前事务的隔离级别是通过@@tx_isolation变量来设定的,默认隔离级别为Repitable Read,通过set transaction isolation level read commited可以更改事务隔离级别。

Hibernate中可以设置事务的隔离级别,不过一般情况下不需要修改,使用数据库默认的隔离级别就可以了。Hibernate支持两种锁机制,即通常所说的”悲观锁(Perssimistic Locking)”和”乐观锁(OptimisticLocking)”。在并发访问场景中,两个对象对同一对象进行更新很可能会导致更新丢失的问题,因此引入悲观锁和乐观锁。悲观锁是指数据有加载的时候就给其加锁,直到该锁被释放掉,其他用户才可以进行修改。悲观锁的优点是数据的一致性好,缺点是系统处理的并发性比较差。悲观锁的实现,往往依靠数据库提供的锁机制,也就是说,只有数据库层提供的锁机制才能真正保证数据库访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据。Hibeinate常用的加锁模式有LockMode.UPGRADE,利用数据库的for update子句实现加锁。

乐观锁本质上不是一种锁机制,只是一种冲突检测机制,是指在对数据进行修改的时候,对数据进行版本号控制或者时间戳等方式来比较数据是否一致。采用版本号控制时,在数据表中加入一个version字段,读取数据时将版本号一同读出,之后更新数据时版本号加1,如果提交数据时版本号小于或等于数据表中的版本号,则认为数据是过期的,抛出异常。实现方法是在POJO类中加上version字段,在配置文件中进行配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值