hibernate乐观锁
就是在数据库中增加一个字段例如version
每一次修改数据的时候,都会修改version的值,所以,同时修改数据的时候并不会成功,同时会抛出一个org.hibernate.StaleObjectStateException异常。这个时候可以捕获这个异常然后,重新修改值,就可以了。
示例:
@Entity
@Table(name = "t_user")
public class User {
private Long id;
private int version;
private String username;
private String password;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Version
public int getVersion() {
return version;
}
@SuppressWarnings("unused")
private void setVersion(int version) {
this.version = version;
}
}
test
@Test
public void testVersion() {
Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();
User user1 = (User) session1.get(User.class, 1L);
User user2 = (User) session2.get(User.class, 1L);
Transaction transaction = session1.beginTransaction();
user1.setUsername(user1.getUsername() + "a");
session1.save(user1);
transaction.commit();
Transaction transaction2 = session2.beginTransaction();
user2.setUsername(user2.getUsername() + "a");
session2.save(user2);
transaction2.commit();
session1.close();
session2.close();
}
输出:
悲观锁:
其他代码都一样,不过,在查询的时候
增加参数
User user1 = (User) session1.get(User.class, 1L, LockOptions.UPGRADE);
输出:
Hibernate: select user0_.id as id0_0_, user0_.password as password0_0_, user0_.username as username0_0_, user0_.version as version0_0_ from t_user user0_ where user0_.id=? for update
关键就是这个for update,这个是基于数据库的,视sql,可能锁表或者多条记录。