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