hibernate 乐观锁&悲观锁

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();
}

输出:hibernate乐观锁并发输出异常栈

悲观锁:
其他代码都一样,不过,在查询的时候
增加参数
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,可能锁表或者多条记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值