낙관적 락 (Optimisstic Lock)


낙관적 락 (Optimisstic Lock) 이란?

  • 락이 생길 경우가 없다고 낙관할때
  • 어플리케이션 레벨에서 제공하는 Lock 기능을 사용
  • JPA가 제공하는 엔티티의 버전 관리 기능을 사용
  • 트랜잭션 커밋 전에는 트랜잭션 충돌을 알 수 없음

JPA가 제공하는 낙관적 락 옵션(LockModeType)

  • NONE :  엔티티를 수정하는 시점에 버전이 증가함
    (엔티티에 @Version이 있으면 기본으로 적용되는 락 옵션)
  • OPTIMISTIC :  엔티티를 조회하는 시점에 버전이 증가함
    (Dierty Read 와 Non-Repeatable Read를 방지)
  • OPTIMISTIC_FORCE_INCREMENT : 논리적으로 변경되었을 경우도 버전이 증가함
    (자식 엔티티만 변경되도 부모 엔티티의 버젼이 강제 증가)

* Non-Repeatable Read 이란 한 트랜잭션내에서 같은 쿼리를 두 번 수행했을 때, 결과가 다르게 나타나는 현상을 의미함

 

낙관적 락 옵션(LockModeType)  적용 예제

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * JPA가 제공하는 낙관적 락 옵션(LockModeType)
     * LockModeType.NONE <-- Entity 에 @Version 있다면 Default 임
     * LockModeType.OPTIMISTIC
     * LockModeType.OPTIMISTIC_FORCE_INCREMENT
     */
    @Lock(LockModeType.OPTIMISTIC)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

버젼 명시 예제

public class UserMasterEntity {

    @Id
    @Column(name = "USER_ID", nullable = false, length = 5)
    private String userId;
    
    @Version
    @Column(name = "DATA_VERSION", nullable = true, precision = 0)
    private Integer dataVersion;

}

 

Lock 을 사용함에 따라 발생할 수 있는 예외

  • ObjectOptimisticLockingFailureException
    (트랜잭션 커밋 시점에 버전이 같지 않으면 발생하는 예외)

사용시 주의사항

  • DB-Lock 을 사용하지 않지만 Dead-Lock이 발생할 수 있음
    (x-Lock이 사용될 경우)
  • 롤백(Rolback) 이슈(어플리케이션 단에서 롤백을 수행해야 함)

* Update 쿼리에 사용되는 모든 레코드에 exclusive lock(x-Lock)을 설정한다고 한다

 

락이 생길 경우가 없다고 낙관할때 사용하는게 좋아보임
(충돌이 예상되거나 충돌이 발생했을 때 비용이 많이 들것이라고 판단되는 곳에서는 사용하지 않는 것이 좋음)

비관적 락 (Pessimistic Lock)


비관적 락 (Pessimistic Lock) 이란?

  • DB에서 제공하는 Lock 기능을 사용
  • 엔티티가 아닌 스칼라 타입을 조회할 때도 사용가능
  • Lock을 획득할 때까지 트랜잭션은 대기 - Lock Timeout 설정가능

JPA가 제공하는 비관적 락 옵션(LockModeType)

  • PESSIMISTIC_WRITE :  베타락, 쓰기/읽기 Lock (Non-Repeatable Read를 방지)
  • PESSIMISTIC_READ :  공유락, 읽기 Lock 
  • PESSIMISTIC_FORCE_INCREMENT : 베타락, 쓰기/읽기 Lock, 낙관적락처럼 버저닝따라서 버전에 대한 컬럼이 필요
    (하이버네이트의 경우 nowait 를 지원하는 데이터베이스에 대해서 FOR UPDATE NOWAIT 옵션을 적용하고, 그렇지 않다면 FOR UPDATE 를 적용한다)

비관적 락 옵션(LockModeType)  적용 예제

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * JPA가 제공하는 비관적 락 옵션(LockModeType)
     * LockModeType.PESSIMISTIC_READ
     * LockModeType.PESSIMISTIC_WRITE
     * LockModeType.PESSIMISTIC_FORCE_INCREMENT
     */
    @Lock(LockModeType.PESSIMISTIC_READ)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

Lock Timeout 적용 예제 - DBMS에서 제공안할 수 도 있음

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * Lock Timeout은 락을 잡고 있는 최대 시간을 설정
     */
    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="10000")})
    @Lock(LockModeType.PESSIMISTIC_READ)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

Lock Scope 적용 예제 - DBMS에서 제공안할 수 도 있음

@Repository
public interface UserMasterJpa extends JpaRepository<UserMasterEntity, String> {
    /**
     * 락 범위(Lock Scope)를 지정
     * NORMAL : 엔터티 자체를 잠급니다. 결합된 상속과 함께 사용하면 조상도 잠김
     * EXTENDED : NORMAL 과 동일한 기능을 포함하며 조인 테이블에서 관련 엔터티를 차단할 수 있습니다.
     */
    @QueryHints({@QueryHint(name = "javax.persistence.lock.scope", value = "EXTENDED")})
    @Lock(LockModeType.PESSIMISTIC_READ)
    Optional<UserMasterEntity> findByUserId(Long id);
}

 

Lock 을 사용함에 따라 발생할 수 있는 예외

  • PessimisticLockException
    (한 번에 하나의 Lock만 얻을 수 있으며, Lock을 가져오는데 실패하면 발생하는 예외)
  • LockTimeoutException
    (락을 기다리다가 설정해놓은 wait time을 지났을 경우 발생하는 예외)
  • PersistanceException
    (영속성 문제가 발생했을 때 발생하는 예외)

사용시 주의사항

  • @Lock 어노테이션이 붙은 메서드 호출은 @Transaction 내부에서 동작함
  • 만약 @Transaction 어노테이션의 영역(Scope) 밖에서 @Lock 어노테이션이 붙은 메서드를 호출한다면 아래와 같은 에러발생
    (javax.persistence.TransactionRequiredException: no transaction is in progress)

 

아래의 URL을 클릭하여 Maven을 다운로드 한다.

maven.apache.org/download.cgi

 

Maven – Download Apache Maven

Downloading Apache Maven 3.6.3 Apache Maven 3.6.3 is the latest release and recommended version for all users. The currently selected download mirror is http://mirror.navercorp.com/apache/. If you encounter a problem with this mirror, please select another

maven.apache.org

 

 

Binary zip archive를 받아서, 원하는 위치에 풀어 놓는다.

 

고급 시스템 설정 -> 환경변수 를 설정해야한다.

 

 

 

환경변수 설정이 끝났으면 CMD창을 통해 정상설치를 확인한다.

> mvn -version

 

'Java > Spring' 카테고리의 다른 글

1. Spring Boot 소개  (0) 2020.09.08

스프링 프레임워크를 더 빠르고 쉽게 그리고 제품수준의 어플리케이션을 만들수 있는 툴이다.

 

스프링부트 요구사항

Spring boot 2.3.3.RELEASE 기준 java 8 이상을 필요로 한다.

빌드툴은 Maven(3.3+), Gradle6.x

지원하는 servletContainer로는 tomcat9.0, jett9.4y Undertow2.0가 있다.

 

docs.spring.io/spring-boot/docs/2.3.3.RELEASE/reference/htmlsingle/#getting-started-introducing-spring-boot

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

 

'Java > Spring' 카테고리의 다른 글

2. Spring Boot - Maven설치(윈도우)  (0) 2020.09.08




증상  


SVN 에러 E155004, E200030 등등





원인 


- SVN 사용시 가끔 lock이 걸리거나 위 그림과 같이 꼬이는 경우가 발생한다.




해결



1-1. 프로젝트 우클릭 > team > cleanup 실행

1-2. cleanup  성공시 다시 업데이트, 실패시 아무런 반응없음


2-1. 해당프로젝트 폴더에보면 숨김폴더로 .svn 폴더가 있다 

2-2. 해당 폴더내에 locked 파일이 존재하면 삭제 후 다시 업데이트


3-1. sqlite 클라이언트 다운로드

http://sqlitebrowser.org/ : 다운로드 속도가 안될 경우 아래 주소에서 다운로드

https://sourceforge.net/projects/sqlitedbrowser/ : 위 주소보다 버전은 낮지만 작업하는데 문제는 없다.



3-2.내려 받은 후, 압축을 푸시면 sqlite3.exe 파일이 하나 있습니다. 

이 파일을 문제가 발생한 프로젝트의 .svn 폴더에 복사합니다. (프로젝트의 하위 폴더에 있습니다.)


그리고 윈도우 커맨드창(Command Window)을 실행하여 해당 경로로 이동한 후, 아래 명령어 2개를 순차적으로 

실행합니다.


sqlite3 .svn/wc.db "select * from WORK_QUEUE"


sqlite3 .svn/wc.db "delete from WORK_QUEUE"


  

3-3 윈도우 커맨드창이 안된다면 직접 sqLite를 실행하여 Open Database를 눌러 오류가 발생했던 파일이 속해 있는 

폴더 내에 .svn 폴더에 wc.db 파일을 open 한 후 아래 명령어를 실행합니다.


 "delete from WORK_QUEUE"


 "delete from WC_LOCK"







1.  CSS 선택


$("div").css("border","9px solid red");

 

2. RADIO 객체

$(':input:radio[name^='+id+']:checked').val()





3. CHECKBOX 객체



예제1) 전체 체크박스 선택 / 해제


 jQuery(document).ready(function(){
  $("#allCategory").bind("click",function(){
   var flag= $(this).attr('checked');
   if($("#allCategory").is(":checked")){
     $("input[name^='categoryName2']").attr('checked',true);
   }else{
    $("input[name^='categoryName2']").attr('checked',false);
   }
  });
});


예제2) 체크박스 체크 확인

if(!$("input:checkbox[id='agree']").is(":checked")){

alert("개인정보 동의에 확인해 주세요");

$("#agree").focus();

return false;

}

 

 

4. selecte객체


$("select[id=a]") or $("select[name=a]")

 

 

 

 5. 상위 객체 찾아가기


예제)

<dl>

<dt>퀴즈1<dt>

<dd>

<ul>

<li><input id="abc"></li>

</ul>

<dd>

<dl>

설명: abc객체의 가장가까운 dd를 찾아서 이전의 dt 엘리먼트의 택스트(퀴즈1)을 가져온다.

var title = $(':input:radio[name^='+id+']').closest('dd').prev('dt').text();






특정 id안에 있는  3번째  TD 에 span테그 추가 하기

 

$("#a0").find("td:eq(2)").html("<span>"+newEmartCode+"</span>");

 

<tr id="a0">

 <td></td>

 <td></td>

 <td><span></span></td>

</tr>

 

<tr id="a1">

<td></td>

<td></td>

<td></td>

</tr>

 

 

 

라벨 텍스트 가져오기

 

 

 

$(document).ready(function(){

$("input[name^=chk]").click(function(){

alert($('label[for='+this.id+']').text());

});

indexedDB 란 web페이지에 내자 DB를 저장 시킬 수 있는 라이브러리임

참고사이트 정리

https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB

데스크톱 브라우저 호환성 표
Mozilla Firefox 52Google Chrome 57Apple Safari 11MS Edge 16
WebGL 지원지원함
GPU 블랙리스트가 적용됩니다. WebGL은 특정 구형 그래픽 카드에서 지원되지 않을 수 있습니다. 세부 정보는 차단리스팅/차단 그래픽스 드라이버에 대한 Mozilla 위키 페이지와 차단리스트 및 허용리스트에 대한 Khronos 위키 페이지에서 확인할 수 있습니다.
지원함
GPU 블랙리스트가 적용됩니다. WebGL은 특정 구형 그래픽 카드에서 지원되지 않을 수 있습니다. 세부 정보는 차단리스팅/차단 그래픽스 드라이버에 대한 Mozilla 위키 페이지와 차단리스트 및 허용리스트에 대한 Khronos 위키 페이지에서 확인할 수 있습니다.
지원함 
Safari 8 이상
지원함
웹 오디오 
(웹 오디오 참조) 
웹 오디오 API는 Unity WebGL 콘텐츠의 사운드를 재생하는 데 필요합니다.
지원함지원함지원함지원함
전체 화면 지원 
(전체 화면 지원 참조)
지원함지원함지원함
Safari 10.1 이상
지원함
커서 잠금 지원 
(커서 잠금 지원 참조)
지원함지원함지원함지원함 
Edge 13 이상
Gamepad 지원 
(Gamepad 지원 참조)
지원함지원함지원함지원함
IndexedDB 
데이터 캐싱 기능, PlayerPrefs 클래스 및 WWW.LoadFromCacheOrDownload에 사용되는 로컬 스토리지에 필요
지원함 
Firefox 42 버전 이하는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다. Firefox 43 이상 버전에서는 이 문제가 수정되었습니다.
지원함지원함 
Safari는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다.
지원함
WebSockets 
네트워킹에 필요
지원함지원함지원함지원함
WebRTC 
WebCamTexture 클래스에서 요구됨
지원함지원함지원 안 함지원함
WebGL 2.0 
(WebGL 2.0 참조)
지원함 
Firefox 51 이상
지원함 
Chrome 56 이상
지원 안 함지원 안 함
asm.js AOT 컴파일 
asm.js는 브라우저에서 특별히 최적화할 수 있는 JavaScript의 서브셋입니다. asm.js 지원을 구현하는 브라우저는 Unity가 asm.js를 사용하기 때문에 Unity WebGL 콘텐츠를 더욱 빠르게 실행할 수 있습니다.
지원함지원 안 함지원 안 함지원함
WebAssembly 
WebAssembly 또는 wasm은 웹에 컴파일하는 데 적합하며, 이식이 가능하고 크기와 로드 시간이 효율적인 새로운 포맷입니다.
지원함 
Firefox 52 이상
지원함 
Chrome 57 이상
지원함
Safari 11 이상
지원함
Edge 16 이상
Large-Allocation Http 헤더 
브라우저가 콘텐츠를 로드하는 데 사용 가능한 메모리가 충분한지 확인하는 데 유용합니다(Large-Allocation Http 헤더 참조).
지원함 
Firefox 53 이상
지원 안 함지원 안 함지원 안 함
Brotli 압축 
빌드 크기를 줄입니다(Brotli 압축 참조).
지원함지원함지원 안 함지원함

참고

  • Chrome은 생성된 JavaScript 코드를 파싱하는 데 많은 양의 메모리를 필요로 할 수 있으므로, 32 비트 브라우저에서 콘텐츠를 로드할 때 메모리 부족 오류 또는 크래시가 발생할 수 있습니다. 메모리 사용에 대한 자세한 내용은 메모리 고려사항을 참조하십시오.


+ Recent posts