java – 如何使用Spring Data JPA查找实体时如何启用LockModeType.PESSIMISTIC_WRITE? - 代码日志

java – 如何使用Spring Data JPA查找实体时如何启用LockModeType.PESSIMISTIC_WRITE?

我如何达到相当于这个代码:

tx.begin();
Widget w = em.find(Widget.class, 1L, LockModeType.PESSIMISTIC_WRITE);
w.decrementBy(4);
em.flush();
tx.commit();

…但是使用Spring和Spring-Data-JPA注释?

我现有的代码的基础是:

@Service
@Transactional(readOnly = true)
public class WidgetServiceImpl implements WidgetService
{
  /** The spring-data widget repository which extends CrudRepository<Widget, Long>. */
  @Autowired
  private WidgetRepository repo;

  @Transactional(readOnly = false)
  public void updateWidgetStock(Long id, int count)
  {
    Widget w = this.repo.findOne(id);
    w.decrementBy(4);
    this.repo.save(w);
  }
}

但是我不知道如何指定updateWidgetStock方法中的所有内容都应该用悲观的锁定来完成。

有一个Spring Data JPA注释org.springframework.data.jpa.repository.Lock,它允许您设置一个LockModeType,但我不知道它是否有效将其放在updateWidgetStock方法上。这听起来更像是WidgetRepository上的注释,因为Javadoc说:

org.springframework.data.jpa.repository
@Target(value=METHOD)
@Retention(value=RUNTIME)
@Documented
public @interface Lock
Annotation used to specify the LockModeType to be used when executing the query. It will be evaluated when using Query on a query method or if you derive the query from the method name.

所以这似乎没有帮助。

如何使我的updateWidgetStock()方法与LockModeType.PESSIMISTIC_WRITE一起执行?

从Spring Data JPA 1.6版本开始,CRUD方法支持@Lock(实际上已经有milestone可用)。有关详细信息,请参阅ticket

使用该版本,您只需声明以下内容:

interface WidgetRepository extends Repository<Widget, Long> {

  @Lock(LockModeType.PESSIMISTIC_WRITE)
  Widget findOne(Long id);
}

这将导致后台存储库代理的CRUD实现部分将配置的LockModeType应用于EntityManager上的find(…)调用。

http://stackoverflow.com/questions/16159396/how-to-enable-lockmodetype-pessimistic-write-when-looking-up-entities-with-sprin

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 如何使用Spring Data JPA查找实体时如何启用LockModeType.PESSIMISTIC_WRITE?