JPA中的乐观锁
和悲观锁
是用于处理并发访问时保证数据一致性的机制。
乐观锁:乐观锁是一种乐观地认为并发访问
冲突的概率很低的机制。在JPA中,乐观锁通常通过版本号(Version)
字段来实现。当一个实体对象在更新时,JPA会检查版本号是否与数据库中的版本号匹配,如果匹配则更新成功,否则抛出异常。
代码如下:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Version
private int version;
}
在上面的示例中,User实体类中通过@Version注解标记了一个版本号字段version,用于乐观锁控制。当更新User对象时,JPA会自动检查版本号,如果版本号匹配则更新成功,否则抛出异常。
悲观锁:悲观锁是一种悲观地认为并发访问冲突的概率很高的机制,因此在访问数据前先加锁
。在JPA中,可以通过查询时加锁来实现悲观锁。
代码如下:
public User findUserWithPessimisticLock(Long userId) {
return entityManager.find(User.class, userId, LockModeType.PESSIMISTIC_WRITE);
}
在上面的示例中,通过entityManager.find方法查询User对象时,使用LockModeType.PESSIMISTIC_WRITE参数来加悲观写锁。这样可以确保在事务中对User对象的操作是串行化的,避免并发冲突。