Spring Boot Isolation.SERIALIZABLE не работает - PullRequest
0 голосов
/ 18 сентября 2018

Мне нужна помощь в этом сценарии, теоретически уровень изоляции Serializable должен прекратить удаление, но в этом сценарии он все равно удаляет строку с идентификатором 1, я пробовал @EnableTransactionManagement и повторное чтение изоляции, этопо-прежнему не блокирует удаление и не вызывает исключение исключения

. Таким образом, мне нужно остановить любой вызов удаления, когда метод обновления все еще продолжается

Я использую H2 вбаза данных памяти для этого образца

Спасибо

Объект:

public class Something {

  @Id
  private Integer id;
  private String name;
  private String desc;
}

Репо:

public interface SomeRepository extends JpaRepository<Something, Integer> {
}

Служба:

@Service
public class SomeService {

  @Autowired
  private SomeRepository someRepository;

  public void deleteSomething2(Something something) {

    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    someRepository.delete(something);
  }

  @Transactional(isolation = Isolation.SERIALIZABLE)
  public void updateSomething2(Something something) {
    Something something1 = someRepository.findById(1).get();

    try {
      Thread.sleep(10000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    something1.setName("namanama");
    someRepository.saveAndFlush(something1);
  }

Тест:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private SomeService service;

    @Test
    public void test() throws Exception {
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    List<Future> futures = new ArrayList<>();
    futures.add(executorService.submit(() -> service.updateSomething2(Something.builder().id(1).name("namaone").build())));
    futures.add(executorService.submit(() -> service.deleteSomething2(Something.builder().id(1).build())));  
    while(futures.stream().filter(f -> f.isDone() == false).count() > 0) {
      Thread.sleep(3000);
    }
        List<Something> all = service.findAll();
        System.out.println(all);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...