Я просто экспериментирую с оптимистической блокировкой.
У меня есть следующий класс:
@Entity
public class Student {
private Integer id;
private String firstName;
private String lastName;
private Integer version;
@Version
public Integer getVersion() {
return version;
}
//all other getters ommited.
}
сейчас я выбираю одного из студентов и пытаюсь одновременно обновлять его свойства.
Thread t1 = new Thread(new MyRunnable(id));
Thread t2 = new Thread(new MyRunnable(id));
t1.start();
t2.start();
и внутри MyRunnable:
public class MyRunnable implements Runnable {
private Integer id;
@Override
public void run() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Student student = (Student) session.load(Student.class, id);
student.setFirstName("xxxx");
session.save(student);
session.getTransaction().commit();
System.out.println("Done");
}
public MyRunnable(Integer id){
this.id = id;
}
}
что происходит, когда первая транзакция успешно обновляет объект, а вторая выдает:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.vanilla.entity.Student#1]
Это нормально.
Мой вопрос:
1) Что мне делать, если я хочу, чтобы вторая транзакция ничего не делала и не выкидывала никаких исключений.
2) Что мне делать, если я хочу, чтобы вторая транзакция переопределяла данные, обновленные первой транзакцией.
Спасибо.