JPA中的Optimistic Lock(乐观锁)和Pessimistic Lock(悲观锁)的区别如下:
Optimistic Lock:
- 认为数据冲突的概率比较低,不会锁定数据。
- 在数据更新时检查版本号或时间戳,如果发生变化则认为数据被其他事务修改,抛出更新冲突异常。
- 可以提高系统吞吐量,减少锁定时间。
- 存在数据更新丢失的风险。
代码示例:
@Entity
public class User {
@Id
private int id;
@Version
private int version;
}
Pessimistic Lock:
- 认为数据冲突的概率比较高,在数据读取时加锁,锁定数据防止其他事务修改。
- 读取数据后可安全更新数据,不会发生更新丢失的情况。
- 会阻塞其他事务,降低系统吞吐量。
- 存在死锁的风险。
代码示例:
// 悲观锁
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
User user = em.find(User.class, 1, LockModeType.PESSIMISTIC_WRITE);
// 更新user
...
tx.commit();
em.close();