@Transactional в Сервисе - PullRequest
       36

@Transactional в Сервисе

0 голосов
/ 20 октября 2018

Я создал приложение для голосования, и у меня есть метод, который изменяет количество голосов.Он реализует интерфейс с аннотацией @Transactional.

@Transactional(readOnly = true)
public interface VotingService {

    Vote getByRestaurantId(int restaurantId);

    Vote get(int id);

    List<Vote> getWithRestaurantsByDate(LocalDateTime date);

    List<Vote> getWithRestaurantsToday(HttpServletResponse response, int id);

    @Transactional
    Vote voteFor(int restaurantId, int userId);
}

Я использую SpringBoot. Будет ли он работать правильно при одновременном голосовании нескольких пользователей.И как вы можете протестировать такое действие?

Последовательное голосование работает правильно.

Код для изменения количества голосов, например:

    @Service
    public class VotingServiceImpl implements VotingService {
    ...

    @Override
    public Vote voteFor(int restaurantId, int userId) {
    ...
        Vote vote = getByRestaurantId(restaurantId);
        vote.setNumberOfVotes(vote.getNumberOfVotes() + 1)
    ...
        return vote;
    ...
    }
    ...

    }




@Entity
@Table(name = "votes", uniqueConstraints = {@UniqueConstraint(columnNames = {"restaurant_id", "date", "votes"}, name = "votes_unique_restaurant_date_votes_idx")})
public class Vote extends AbstractEntity {
    @Column(name = "votes")
    private int numberOfVotes;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "restaurant_id", nullable = false)
    @NotNull
    private Restaurant restaurant;

    public int getNumberOfVotes() {
        return numberOfVotes;
    }

    public void setNumberOfVotes(int numberOfVotes) {
        this.numberOfVotes = numberOfVotes;
    }

    public Vote() {
    }

    public Restaurant getRestaurant() {
        return restaurant;
    }

    public void setRestaurant(Restaurant restaurant) {
        this.restaurant = restaurant;
    }

    @Override
    public String toString() {
        return "Vote{" +
                super.toString() +
                "numberOfVotes=" + numberOfVotes +
                ", restaurant=" + restaurant +
                '}';
    }
}

Спасибо!

1 Ответ

0 голосов
/ 20 октября 2018
  • VotingService - это интерфейс.
  • Реализующий класс VotingServiceImpl по умолчанию является синглтон-классом по умолчанию.Это разделено между потоками.
  • В нем не должно быть переменной экземпляра для хранения информации для голосования.

Вы можете проверить правильность услуги, выполнив параллельный запрос, используя почтальон или jmeter

...