一、悲观锁
悲观锁不是Hibernate的锁,而是数据库的update锁,select * from item for update. Hibernate 就是利用这种锁机制,在查询上上锁。 悲观锁的作用范围太大,查询也被锁住
1 public void updateStock(){ 2 Session session = HibernateUtils.getSession(); 3 Transaction tx = session.beginTransaction(); 4 try{ 5 //使用悲观锁查询,如果一个请求在查询时,另一个请求被阻塞在外 6 Item item = (Item) session.load(Item.class, 1, LockOptions.UPGRADE); 7 item.setStock(item.getStock() - 2); 8 tx.commit(); 9 } catch (Exception e) { 10 e.printStackTrace(); 11 tx.rollback(); 12 }finally{ 13 HibernateUtils.closeResource(session); 14 } 15 }
二、乐观锁
乐观锁使用应用程序上的版本控制(由程序逻辑来实现的)来避免可能出现的并发问题。
1、类中添加version字段
1 private Integer version;
2、在类的hbm.xml配置文件中配置相应的字段
1 <!-- 乐观锁的版本字段映射 --> 2 <version name="version"></version>