2011-10-19 1 views
0

행에 select를 수행하고 값을 업데이트하려고합니다. 이 작업을 수행하는 동안 행에 독점적으로 액세스해야합니다. 즉, 다른 프로세스 (VM 내부 또는 외부)는 행을 업데이트 할 때까지 행을 읽을 수 있어야합니다. 현재 값은 "선택 가능"해서는 안됩니다. 다음 트랜잭션 주석을 시도했습니다.최대 절전 모드를 사용하는 Spring 트랜잭션을 사용하는 SQL Server 단독 행 잠금 (XLOCK ROWLOCK)

@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout=960) 

이 확실히 봄의 컨텍스트 내에서 작동하지만 거래의 중간에 잠 문을 넣는 동안, 난 여전히 데이터베이스 도구를 사용하여 현재 행의 값을 선택할 수 있어요.

봄/최대 절전 모드를 사용하여 XLOCK/ROWLOCK (적절한 방법)을 얻을 수있는 방법이 있습니까?

버전 :

  • 봄 : 3.0.5.RELEASE
  • 최대 절전 모드 : 3.6.3.Final
  • JTDS : 1.2.4

내가 할 수없는 경우 Spring/Hibernate를 사용하면 JTDS 예제에 대한 링크가 크게 도움이 될 것입니다.

감사합니다.

+0

다른 방법으로 데이터베이스 도구에서 "업데이트 용"접미사를 사용하여 select를 실행 한 다음 응용 프로그램에서 프로그램을 실행 해보십시오. 위 쿼리를 실행하기 전에 도구의 격리 수준을 확인해야 할 수도 있습니다. – r0ast3d

+0

나는 그것을 시도 할 것이다. 변경하지 않고 필요한 잠금 장치를 이미 확보하고있을 수 있습니다. – JustinKSU

+0

나는 분명히 무슨 일이 일어나고 있는지 말해야한다고 생각한다. 업데이트를 해주시기 바랍니다. – r0ast3d

답변

4

SERIALIZABLE 격리 수준을 사용하면 다른 트랜잭션이 데이터를 읽을 수는 있지만 수정할 수는 없습니다. 따라서 명시 적으로 SELECT ... FOR UPDATE (최대 절전 모드에서 : Query#setLockMode(LockMode.UPGRADE))이 필요합니다.

+0

나는 그것을 시험해 보겠다. – JustinKSU

+0

SQL 서버 – JustinKSU

+0

에서 "FOR UPDATE"를 할 수 있습니까? [누군가] (http://stackoverflow.com/questions/1483725) 이미 운동을했습니다. –

2

최대 절전 모드에서 명시 적 잠금을 사용하십시오. 더 많은 정보가 here입니다.

하지만 다시 생각해보십시오. 비관적 인 자물쇠가 정말로 필요합니까? 대부분의 경우 낙관적 잠금이 더 잘 작동하고 최대 절전 모드는 버전 관리를 아주 잘 지원합니다.

+0

이 테이블은 시퀀스로 사용됩니다. 나는 그것을 사용하고 증가시키기 전에 다른 프로세스가 그 값을 사용하지 못하도록 비관적 인 잠금이 필요하다고 생각한다. – JustinKSU

+0

gap-less sequence가 필요합니까? – kan

+0

나는 그것이 요구 사항이라고 생각하지 않는다. 왜? – JustinKSU

관련 문제