hibenate 학습 13 의 비관 적 자물쇠 와 낙관 자물쇠

5117 단어 .netxmlHibernateJUnit
비관 적 자물쇠
비관 적 인 잠 금 의 실현 은 보통 데이터 베이스 체제 에 의존 하고 전체 과정 에서 데 이 터 를 잠 그 며 다른 사용자 들 은 읽 거나 수정 할 수 없습니다.
비관 적 인 자 물 쇠 를 사용 하면 load 의 lazy 는 효력 을 잃 습 니 다.
아래 의 예 를 보십시오.

import org.hibernate.LockMode;
import org.hibernate.Session;

import junit.framework.TestCase;

public class PessimisticLockingTest extends TestCase {

//            ,     ,    
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Inventory inv = (Inventory)session.load(Inventory.class, 1, LockMode.UPGRADE);//  ,      
			System.out.println("itemName=" + inv.getItemName());
			System.out.println("quantity=" + inv.getQuantity());
			inv.setQuantity(inv.getQuantity() - 200);
			session.update(inv);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}
//           ,    (    ),           ,          。
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Inventory inv = (Inventory)session.load(Inventory.class, 1, LockMode.UPGRADE);
			System.out.println("itemName=" + inv.getItemName());
			System.out.println("quantity=" + inv.getQuantity());
			inv.setQuantity(inv.getQuantity() - 200);
			session.update(inv);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}
	
}


낙관 론
원리: 대부분 데이터 버 전 기록 체제 (version) 를 바탕 으로 이 루어 집 니 다. 일반적으로 데이터베이스 시트 에 version 필드 를 추가 합 니 다.
데 이 터 를 읽 을 때 버 전 번 호 를 함께 읽 고 데 이 터 를 업데이트 할 때 버 전 번 호 를 1 로 추가 합 니 다. 데 이 터 를 제출 할 때 버 전 번호 가 데이터 시트 의 버 전 번호 보다 작 거나 같 으 면 데이터 가 만 료 되 었 다 고 생각 합 니 다. 그렇지 않 으 면 업 데 이 트 를 해 줍 니 다.

public class Inventory {
	private int itemNo;	
	private String itemName;	
	private int quantity;	
	private int version;//      ,            。
	//setter,getter	
}


낙관적 잠 금 설정:

<?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>
	<class name="com.bjsxt.hibernate.Inventory" table="t_inventory" optimistic-lock="version">
		<id name="itemNo">
			<generator class="native"/>
		</id>
<!--version         -->
		<version name="version"/>
		<property name="itemName"/>
		<property name="quantity"/>
	</class>
</hibernate-mapping>

낙관적 인 자물쇠 테스트:

import org.hibernate.LockMode;
import org.hibernate.Session;

import junit.framework.TestCase;

public class OptimisticLockingTest extends TestCase {
//             ,     ,    
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Inventory inv = (Inventory)session.load(Inventory.class, 1);
			System.out.println("itemName=" + inv.getItemName());
			System.out.println("version=" + inv.getVersion());
			System.out.println("quantity=" + inv.getQuantity());
			inv.setQuantity(inv.getQuantity() - 200);
			session.update(inv);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}
//              ,      ;         ,              ,                 ,      。(    )
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Inventory inv = (Inventory)session.load(Inventory.class, 1);
			System.out.println("itemName=" + inv.getItemName());
			System.out.println("version=" + inv.getVersion());
			System.out.println("quantity=" + inv.getQuantity());
			inv.setQuantity(inv.getQuantity() - 200);
			session.update(inv);
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}	
	}
	
}

좋은 웹페이지 즐겨찾기