08-02-2023, 03:51 PM
How can I achieve the equivalent of this code:
tx.begin();
Widget w = em.find(Widget.class, 1L, LockModeType.PESSIMISTIC_WRITE);
w.decrementBy(4);
em.flush();
tx.commit();
... but using Spring and Spring-Data-JPA annotations?
The basis of my existing code is:
@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);
}
}
But I don't know how to specify that everything in the `updateWidgetStock` method should be done with a pessimistic lock set.
There is a Spring Data JPA annotation `org.springframework.data.jpa.repository.Lock` which allows you to set a `LockModeType`, but I don't know if it's valid to put it on the `updateWidgetStock` method. It sounds more like an annotation on the `WidgetRepository`, because the Javadoc says:
> org.springframework.data.jpa.repository <br>
> @Target(value=METHOD) <br>
> @Retention(value=RUNTIME) <br>
> @Documented <br>
> public @interface Lock <br>
> 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.
... so that doesn't seem to be helpful.
How can I make my `updateWidgetStock()` method execute with `LockModeType.PESSIMISTIC_WRITE` set?
tx.begin();
Widget w = em.find(Widget.class, 1L, LockModeType.PESSIMISTIC_WRITE);
w.decrementBy(4);
em.flush();
tx.commit();
... but using Spring and Spring-Data-JPA annotations?
The basis of my existing code is:
@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);
}
}
But I don't know how to specify that everything in the `updateWidgetStock` method should be done with a pessimistic lock set.
There is a Spring Data JPA annotation `org.springframework.data.jpa.repository.Lock` which allows you to set a `LockModeType`, but I don't know if it's valid to put it on the `updateWidgetStock` method. It sounds more like an annotation on the `WidgetRepository`, because the Javadoc says:
> org.springframework.data.jpa.repository <br>
> @Target(value=METHOD) <br>
> @Retention(value=RUNTIME) <br>
> @Documented <br>
> public @interface Lock <br>
> 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.
... so that doesn't seem to be helpful.
How can I make my `updateWidgetStock()` method execute with `LockModeType.PESSIMISTIC_WRITE` set?