Мне нужна помощь в этом сценарии, теоретически уровень изоляции 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);
}
}