Hibernate提供了两种锁机制:悲观锁和乐观锁。
悲观锁和乐观锁的区别:
乐观锁 | 悲观锁 |
不管有多少线程同时访问同一条数据;给数据加上一个版本号;每次提交数据的时候对比 如果提交的数据版本高于数据库版本;那么进行更新(版本号—+1);如果提交的数据版 本低于 数据库版本则提交失败(取决于谁先提交数据) | 当有一个线程在访问数据库中的某一条记录的时候;悲观的认为其他的线程有可能也要访问;这时就悲观的把这条记录锁定(基于数据库锁机制完成);得到事务提交之后自动释放 缺点:当数据长时间不提交的时候;其他的线程无法进行对数据操作;这样对数据库的 连接成本 开销非常高(不适用) |
以乐观锁为例:
用部门表为例:
package com.msit.hibernate.entity;import java.util.Set;/** * 部门 * @author Administrator * 在部门的角度关系:一对多(一个部门多个员工)one-to-many */public class Department { PRivate int id; private String name; private int ver; private Set<Employee> emps;//员工集合 /** * @return the ver */ public int getVer() { return ver; } /** * @param ver the ver to set */ public void setVer(int ver) { this.ver = ver; } /** * @return the emps */ public Set<Employee> getEmps() { return emps; } /** * @param emps the emps to set */ public void setEmps(Set<Employee> emps) { this.emps = emps; } /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } }
Department.hbm映射
<?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="com.msit.hibernate.entity"> <!-- 对象 关系 映射 --> <class name="Department" table="t_department"> <id name="id"> <generator class="increment"/> </id> <!--必须在id节点下--> <version name="ver"/> <property name="name" /> <!-- lazy:是否采用延迟加载策略;默认值为true fetch:采用什么抓取策略;默认为逐条抓取select --> <set name="emps" cascade="all" > <key column="depart_id"></key><!-- 对应员工表中的外键 --> <one-to-many class="Employee" /> </set> </class></hibernate-mapping>
测试类:
package com.msit.hibernate.lock;import org.hibernate.HibernateException;import org.hibernate.session;import org.hibernate.Transaction;import com.msit.hibernate.entity.Department;import com.msit.hibernate.tool.HibernateUtil;public class Lock { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub lock(); //add(); } static void lock(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Department dpt = (Department) session.get(Department.class, 2); dpt.setName("人事部"); System.out.println("数据版本1:"+dpt.getVer()); Session session2 = HibernateUtil.getSession(); Transaction tx2 = session2.beginTransaction(); Department dpt2 = (Department) session2.get(Department.class, 2); dpt2.setName("人事"); System.out.println("数据版本2:"+dpt2.getVer()); tx2.commit(); Department dpt3 = (Department) HibernateUtil.getSession().get(Department.class, 2); System.out.println("更新之后数据版本:"+dpt3.getVer()); tx.commit(); } static void add(){ try { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Department dpt = new Department(); dpt.setName("人事部"); session.save(dpt); tx.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 2276292708@QQ.com如果需要转载,请注明出处,谢谢!!
新闻热点
疑难解答