dan*_*nik 6 java concurrency hibernate java-ee
我只是在尝试乐观锁定.
我有以下课程:
@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.
}
Run Code Online (Sandbox Code Playgroud)
现在我正在抓住其中一个学生并尝试同时更新其属性.
Thread t1 = new Thread(new MyRunnable(id));
Thread t2 = new Thread(new MyRunnable(id));
t1.start();
t2.start();
Run Code Online (Sandbox Code Playgroud)
和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;
}
}
Run Code Online (Sandbox Code Playgroud)
第一个事务成功更新对象和第二个事务抛出的情况:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.vanilla.entity.Student#1]
Run Code Online (Sandbox Code Playgroud)
还行吧.
我的问题是:1)如果我希望第二个交易什么都不做而且不抛出任何异常,我该怎么办?
2)如果我希望第二个事务覆盖第一个事务更新的数据,我该怎么办?
谢谢.
jeh*_*eha 10
我试着回答你的问题:
您使用乐观锁定.因此,您希望OptimisticLockException在版本冲突中抛出一个- 但您可以捕获它并且什么都不做.您不能将其关闭一秒(无论这意味着什么)事务,因为您不知道是否会发生版本冲突(这是乐观锁策略的本质:乐观假设是版本冲突不会经常发生)
如果OptimisticLockException发生,您基本上有2个选项:
如果您有并发更新,问题是如何或谁将决定哪个状态是实际的"正确"(表示最新的).只要保证一致性,我就不在乎了.
| 归档时间: |
|
| 查看次数: |
19872 次 |
| 最近记录: |