Я пытаюсь смоделировать ошибку OptimisticLockException, создав два потока и удалив одинаковые записи в обоих. Я прочитал несколько блогов, но не смог найти, как правильно обработать эту ошибку или какой-либо механизм, чтобы повторить неудачную операцию.
Если я удаляю версию, код аннотации работает отлично. Я не уверен, насколько pessimisticLocking снизит производительность в большой кодовой базе.
Вот часть моего кода.
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Version
private long version;
@Column(name="first_name", nullable=false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(name = "ssn", nullable = false, unique = true)
private int ssn;
}
public class PersonService{
@Autowired
PersonRepository repo;
@Autowired
EntityManager em;
public void save(Person person) {
repo.save(person);
}
@Transactional
public void delete(Person p) {
System.out.println("Deleting Person" + p);
repo.delete(p);
}
}
public class Main {
public static void main(String[] args){
Person p = new Person("A", "B");
try {
Thread thread1 = new Thread(() -> {
repo.delete(p);
});
Thread thread2 = new Thread(() -> {
repo.delete(p);
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}catch(Exception ex) {
System.out.println("Exception in thread");
}
}
}
}
Этот блок catch никогда не вызывается.