Hibernate入门BLOG[十五、Hibernate的乐观锁与悲观锁]

来源:互联网 发布:淘宝祛痘产品 编辑:程序博客网 时间:2024/06/10 01:02
Hibernate事务的悲观锁和乐观锁:当2个管理员同时想修改一个用户的信息怎么办?这个和并发是类似的,如果不做任何处理的话,那么后期调用的会将前面的那个覆盖掉,这样的话第一个修改的信息就会被覆盖掉。解决方法:悲观锁:读取用户的时候将用户枷锁。别人读取的时候就不可以读取。然后修改完成之后再开锁。悲观锁的缺点:如果修改的用户没有编辑提交,那么所有的人就只能等。它不能访问这个数据。乐观锁:给记录加上一个版本号。第一个用户修改完成之后更新版本。但是第二个用户读取的时候版本号是上一个版本。所以第二个用户修改的是不成功的。乐观锁的使用方法:以User对象为实例:1、Java实例。省略set和get方法public class User {private int id;private Name name;private Date birthday;//版本号,乐观锁的应用private int ver;}映射xml文件配置:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--指定映射的类所在的包--><hibernate-mapping package="cn.hibernate.model"><class name="User" table="user"><id name="id"><!-- 主键生成器 --><generator class="native"/></id><!-- 版本号,乐观锁解决方法 ,必须要放在ID的下面--><version name="ver" /><!-- 复合组建类型 --><component name="name"><property name="firstName" /><property name="lastName" /></component><property name="birthday"></property></class></hibernate-mapping>调用测试:2个线程同时编辑Session s = null;Transaction tr = null;int id = 2;try{//线程1s = HibernateUtil.getSession();Transaction ss = s.beginTransaction();User u = (User) s.get(User.class, id);//线程2Session s3 = HibernateUtil.getSession();Transaction ss3 = s3.beginTransaction();User u3 = (User) s3.get(User.class, id);u.getName().setFirstName("aa");u3.getName().setFirstName("bb");ss.commit();ss3.commit();}catch(HibernateException e){throw e;}finally{if(s != null){s.close();}}