JPA中的Optimistic Lock和Pessimistic Lock有什么区别?

JPA中的Optimistic Lock(乐观锁)和Pessimistic Lock(悲观锁)的区别如下:

Optimistic Lock:

  1. 认为数据冲突的概率比较低,不会锁定数据。
  2. 在数据更新时检查版本号或时间戳,如果发生变化则认为数据被其他事务修改,抛出更新冲突异常。
  3. 可以提高系统吞吐量,减少锁定时间。
  4. 存在数据更新丢失的风险。

代码示例:

@Entity 
public class User {
    @Id
    private int id;
    @Version
    private int version;  
}

Pessimistic Lock:

  1. 认为数据冲突的概率比较高,在数据读取时加锁,锁定数据防止其他事务修改。
  2. 读取数据后可安全更新数据,不会发生更新丢失的情况。
  3. 会阻塞其他事务,降低系统吞吐量。
  4. 存在死锁的风险。

代码示例:

// 悲观锁 
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();