문제

원시 SQL을 사용하여 카운터를 업데이트하는 카운터 기능이 있다고 가정 해 봅시다.

 public void updateCounter() {
   executeSql("UPDATE counter SET count_value = count_value + 1 WHERE id = 1;");
 }

데이터베이스는 카운터에 대한 두 개의 동시 호출이 예상대로 처리되도록합니다. 모든 통화는 한 번의 증분으로 카운터를 업데이트하고 업데이트가 손실되지 않습니다.

원시 SQL 명령을 발행하여이를 실행하는 대신 Gorm을 사용하고 싶습니다. 순진한 방법은 다음의 선을 따라 무언가가 될 것입니다.

 public void updateCounter() {
   Counter c = Counter.get(1)
   c.countValue += 1
   c.save()
 }

이 경우 두 스레드가 동시에 updateCounter () 메소드를 호출하면 업데이트가 손실 될 수 있다고 가정합니다. 이 동시성 문제를 처리하기 위해 올바른 "성배/Gorm-way"는 무엇입니까?

도움이 되었습니까?

해결책

최대 절전 모드와 Gorm이 지원하는 '비관적'또는 '낙관적'잠금 전략을 사용할 수 있습니다. 기본 Gorm 전략은 '낙관적'입니다 (기본적으로 생성 된 지속적인 도메인 엔티티의 버전 열/속성을 사용). 다음과 같이 사용할 수 있습니다.

...
try {
 Counter c = Counter.get(1)
 c.countValue += 1
 c.save(flush:true)
}
catch(org.springframework.dao.OptimisticLockingFailureException e) {
// deal with concurrent modification here
}
...

대신 '비관적'잠금 전략을 대신 선호하는 경우 (다른 모든 동시 읽기, BTW), 명시 적 '잠금'Gorm Meta-Metha Metod를 사용하여 다음을 수행 할 수 있습니다.

...
Counter c = Counter.lock(1) //lock the entire row for update
c.countValue += 1
c.save(flush:true) //GORM will autorelease the lock once the TX is committed
...

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top