如何实现此代码的等效项:
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
允许您设置 a LockModeType
,但我不知道将它放在updateWidgetStock
方法上是否有效。这听起来更像是 上的注释WidgetRepository
,因为 Javadoc 说:
org.springframework.data.jpa.repository
@Target(value=METHOD)
@Retention(value=RUNTIME)
@Documented
public @interface Lock
注解用于指定执行查询时要使用的 LockModeType。在查询方法上使用 Query 或从方法名称派生查询时,将对它进行评估。
......所以这似乎没有帮助。
如何使我的updateWidgetStock()
方法使用LockModeType.PESSIMISTIC_WRITE
set 执行?