Hibernate 의 사무 관리

데이터베이스 트 랜 잭 션 데이터 베 이 스 는 일련의 데이터 베 이 스 를 하나의 단원 으로 구성 하 는 것 을 말 합 니 다. 이 단원 의 모든 작업 은 이 작업 들 이 모두 완성 되 거나 모두 취소 되 는 것 을 말 합 니 다.
 
트 랜 잭 션 특성 (acid)
데이터베이스 업 무 는 반드시 ACID 특성 을 갖 추어 야 하 며, ACID 는 Atomic (원자 성), Consistency (일치 성), Isolation (격 리 성), Durability (지속 성) 의 영문 줄 임 말이다.원자 성: 하나의 사 무 는 하나의 단원 으로 구성 되 어 있 습 니 다. 이 단원 은 데이터 베이스 에 대한 몇 가지 조작 을 포함 하고 있 습 니 다. 이 조작 들 은 모두 성공 하거나 실패 하면 모든 조작 이 취소 되 고 초기 상태 로 회 복 됩 니 다.
일치 성: 데이터베이스 업무 가 관계 데이터 의 완성 성과 업무 논리 상의 일치 성 을 파괴 해 서 는 안 된다 는 것 을 말한다.예 를 들 어 은행 의 이체 업무 에 대해 업무 가 성공 하 든 실패 하 든 업무 가 끝 난 후에 ACCOUNTS 표 에서 사용자 A 와 사용자 B 의 저금 총액 이 똑 같다 는 것 을 보증 해 야 한다. 격 리 성: 동시 다발 환경 에서 서로 다른 업무 가 똑 같은 데 이 터 를 동시에 조작 할 때 모든 업 무 는 각자 의 완전한 데이터 공간 을 가지 고 서로 간섭 하지 않 는 다 는 것 을 말한다.지속 성: 업무 가 성공 적 으로 끝나 면 데이터 베 이 스 를 업데이트 할 때 영구적 으로 저장 해 야 한 다 는 것 을 말한다.시스템 붕괴 가 발생 하 더 라 도 데이터베이스 시스템 을 다시 시작 하면 데이터 베 이 스 는 업무 가 성공 적 으로 끝 났 을 때의 상태 로 회복 할 수 있다.
프로 그래 밍 과 성명 식 사무:
프로 그래 밍 (Programmatical) 식 성명 식 (Declarative)
 
 
트 랜 잭 션 격 리 단계       기업 급 데이터 베 이 스 는 매 초 수천 명의 동시 방문 에 대응 할 수 있 기 때문에 동시 통제 문 제 를 가 져 왔 다.데이터 베이스 이론 을 통 해 알 수 있 듯 이 동시 방문 으로 인해 예측 할 수 없 는 시간 에 다음 과 같은 몇 가지 예상 할 수 있 는 문 제 를 일 으 킬 수 있 습 니 다. 더러 운 읽 기: 제출 되 지 않 은 데 이 터 를 읽 는 것 을 포함 합 니 다.예 를 들 어 트 랜 잭 션 1 이 줄 을 바 꾸 었 습 니 다.트 랜 잭 션 2 는 트 랜 잭 션 1 이 변경 사항 을 제출 하기 전에 변 경 된 줄 을 읽 습 니 다.트 랜 잭 션 1 스크롤 백 이 변경 되면 트 랜 잭 션 2 는 논리 적 으로 존재 하지 않 는 줄 을 읽 습 니 다.중복 읽 기 불가: 한 사무 가 같은 줄 을 한 번 에 읽 는 것 이 아니 라 하나의 단독 사무 가 두 번 (또는 여러 번) 읽 는 사이 에 이 줄 을 수정 할 때 같은 사무 에서 여러 번 읽 는 사이 에 이 줄 을 수정 하기 때문에 읽 을 때마다 다른 값 을 생 성하 여 일치 하지 않 는 문 제 를 일 으 킵 니 다.   
      두 번 째 유형 분실 업데이트: 다시 읽 을 수 없 는 특례 입 니 다. 예 를 들 어 을 은 두 번 째 조 회 를 하지 않 고 직접 조작 을 했 습 니 다. 계좌 내 에서 최종 적 으로 100 위안 이 고 갑 의 조작 이 덮어 져 은행 은 100 위안 의 손실 을 입 었 습 니 다.첫 번 째 잃 어 버 린 업데이트 와 유사 한 것 같 습 니 다.환상: 하나의 작업 을 통 해 이전에 업 무 를 제출 하지 않 은 다른 작업 에서 읽 은 줄 의 범위 에 새 줄 을 삽입 하거나 기 존 줄 을 삭제 합 니 다.제출 되 지 않 은 작업 이 있 습 니 다. 이 범위 의 줄 수 변경 으로 원본 읽 기 를 반복 할 수 없습니다.
트 랜 잭 션 격 리 단계:
Read Uncommitted:
  • 업데이트 분실 (false)
  • 더러 운 읽 기 (true)
  • 중복 읽 기 불가 (true)
  • 환 독 (true)
  • Read Committed:
  • 업데이트 분실 (false)
  • 더러 운 읽 기 (false)
  • 중복 읽 기 불가 (true)
  • 환 독 (true)
  • Repeatable Read:
  • 업데이트 분실 (false)
  • 더러 운 읽 기 (false)
  • 중복 읽 기 불가 (false)
  • 환 독 (true)
  • Serializable:
  • 업데이트 분실 (false)
  • 더러 운 읽 기 (false)
  • 중복 읽 기 불가 (false)
  • 환 독 (false)
  • Hibernate 의 사무
     
     
     Hibernate 에서 의 사무 관리 API
    org.hibernate.TransactionCommit()Rollback()
     
    자물쇠:
    ibernate 에서 거시적인 측면 에서 데이터 뱅 크 의 서로 다른 사무 격 리 단 계 를 설정 하여 사무 간 의 병행 집행 을 통제 합 니 다.미시적 인 측면 에서 낙관적 인 자물쇠 나 비관 적 인 자 물 쇠 를 사용 하여 사 무 를 세분 화 하 는 병행 통 제 를 한다.
    비관 적 잠 금 비관 적 잠 금 (Pessimtic Locking), 데이터 베 이 스 를 읽 거나 수정 할 때마다 다른 사무 도 같은 데 이 터 를 동시 방문 하고 있다 고 비관 적 으로 생각 합 니 다.
     
     
     
    Transaction tx = session.beginTransaction();
    Query query = session.createQuery("from Testbook tb");
    query.setLockMode("tb",LockMode.UPGRADE);
    List<Testbook> list=query.list();
    tx.commit();

     
       
     
     Session 대상 의 lock () 방법 비관 적 잠 금 설정
     
    Transaction tx=session.beginTransaction();
    Testbook tb=(Testbook)session.get(Tsetbook.class,new Integer(1));
    session.lock(tb,LockMode.UPGRADE);
    tx.commit();

     
    혹은
      
    Transaction tx=session.beginTransaction();
    Testbook tb=(Testbook)session.get(Tsetbook.class,new Integer(1),LockMode.UPGRADE);
    tx.commit();

     
     낙관적 인 자물쇠, 낙관적 인 자물쇠, 데이터베이스 에 있 는 데이터 가 동시에 조작 되 는 문제 가 거의 발생 하지 않 는 다 고 생각 합 니 다.실현 에 있어 낙관적 잠 금 은 데이터 의 버 전 번호 (Version) 비교 메커니즘 을 통 해 이 루어 질 수 있다.
    응용 시스템 의 성능 과 데이터 일치 성 간 의 모순 을 균형 있 게 한다. 실제 개발 에 서 는 데이터베이스 에 격 리 단 계 를 ReadCommitted 로 설정 한 다음 에 프로그램 에서 잠 금 이 필요 한 코드 에 낙관적 인 잠 금 을 실현 할 수 있다.
     
    버 전 번호 방식 으로 낙관적 인 잠 금 실현:
     
    public class Testbook implements java.io.Serializable{
    	//       ,     getter setter  
    	private Interger version;
    }

     
    <class name="com.rbh.examples.Testbook" table="TESTBOOK" 
    optimistic-lock="version">
    <id name="id" type="java.lang.Integer"></id>
    <version name="version" column="version" access="field"/>

      
    타임 스탬프 낙관 잠 금 실현:
     
    public class Testbook implements java.io.Serializable{
    	private java.sql.Timestamp updateTime;
    }
    

     
    <class name="com.rbh.examples.Testbook" table="TESTBOOK">
    	<id name="id" type="java.lang.Integer"></id>
    	<timestamp name="updateTime" column="update_time" 
    
    access="field">

      
     
     
     

    좋은 웹페이지 즐겨찾기