java – 乐观锁定和org.hibernate.StaleObjectStateException:
发布时间:2020-12-14 05:55:22 所属栏目:Java 来源:网络整理
导读:我只是在尝试乐观锁定. 我有以下课程: @Entitypublic class Student { private Integer id; private String firstName; private String lastName; private Integer version; @Version public Integer getVersion() { return version; }//all other getters
我只是在尝试乐观锁定.
我有以下课程: @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] 还行吧. 我的问题是: 2)如果我希望第二个事务覆盖第一个事务更新的数据,我该怎么办? 谢谢. 解决方法
我试着回答你的问题:
>您使用乐观锁定.因此,您希望在版本冲突时抛出OptimisticLockException – 但您可以捕获它并且不执行任何操作.您不能将其关闭一秒(无论这意味着什么)事务,因为您不知道是否会发生版本冲突(这是乐观锁策略的本质:乐观假设是版本冲突不会经常发生) >放弃更改(也许刷新当前状态) 如果您有并发更新,问题是如何或谁将决定哪个状态是实际的“正确”(表示最新的).只要保证一致性,我就不在乎了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |