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如果需要轉載,請注明出處,謝謝!!
新聞熱點
疑難解答