乐观锁和悲观锁
程序员文章站
2022-06-02 11:13:45
...
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别
人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做
操作之前先上锁。
Hibernate 的悲观锁,也是基于数据库的锁机制实现。下面的代码实现了对查询记录的加锁:
人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做
操作之前先上锁。
一个典型的倚赖数据库的悲观锁调用:
select * from account where name=”Erica” for update
这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 Hibernate 的悲观锁,也是基于数据库的锁机制实现。下面的代码实现了对查询记录的加锁:
String hqlStr ="from TUser as user where user.name='Erica'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); // 加锁
List userList = query.list();// 执行查询,获取数据
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一
下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供
类似于write_condition机制的其实都是提供的乐观锁。
乐观锁,大多是基于数据版本 Version )记录机制实现。什么是数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通
过为数据库表增加一个 “version” 字段来 实现。 读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提 交数据的版本数据与数据
库表对应记录的当前版本信息进行比对,如果提交的数据 版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
推荐阅读
-
高性能的MySQL(5)索引策略一压缩,冗余,重复,索引和锁
-
Innodb中的事务隔离级别和锁的关系
-
对MySQL的悲观锁与乐观锁做个小调查
-
java 使用ConcurrentHashMap和计数器实现锁
-
Java concurrency之共享锁和ReentrantReadWriteLock_动力节点Java学院整理
-
Java多线程之显示锁和内置锁总结详解
-
详谈锁和监视器之间的区别_Java并发
-
事务和锁--查看数据库中的锁
-
透彻理解Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别
-
Java concurrency之共享锁和ReentrantReadWriteLock_动力节点Java学院整理