hibenate 학습 13 의 비관 적 자물쇠 와 낙관 자물쇠
비관 적 인 잠 금 의 실현 은 보통 데이터 베이스 체제 에 의존 하고 전체 과정 에서 데 이 터 를 잠 그 며 다른 사용자 들 은 읽 거나 수정 할 수 없습니다.
비관 적 인 자 물 쇠 를 사용 하면 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);
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.