2011-11-25 5 views
2

내가 테이블을 고정하는 방법 중첩 된 세트 모델jOOQ 복잡한 업데이트 - 테이블을 잠그는 방법? 여기

LOCK TABLE mytestdb.tbltree WRITE; 

SELECT @myRight := rgt FROM mytestdb.tbltree 
WHERE name = 'apples'; 

UPDATE mytestdb.tbltree SET rgt = rgt + 2 WHERE rgt > @myRight; 
UPDATE mytestdb.tbltree SET lft = lft + 2 WHERE lft > @myRight; 

INSERT INTO mytestdb.tbltree(name, lft, rgt) 
VALUES('beans', @myRight + 1, @myRight + 2); 

UNLOCK TABLES; 

에 대해 "노드를 추가"SQL 쿼리 및

Record record = create.select(Tbltree.RGT) 
    .from(Tbltree.TBLTREE) 
    .where(Tbltree.NAME.equal("apples")) 
    .fetchOne(); 

int myright = record.getValue(Tbltree.RGT); 

create.update(Tbltree.TBLTREE).set(Tbltree.RGT, Tbltree.RGT.add(2)) 
     .where(Tbltree.RGT.greaterThan(myright)).execute(); 

create.update(Tbltree.TBLTREE).set(Tbltree.LFT, Tbltree.LFT.add(2)) 
     .where(Tbltree.LFT.greaterThan(myright)).execute(); 

TbltreeRecord record2 = (TbltreeRecord) create 
    .insertInto(Tbltree.TBLTREE, Tbltree.NAME, Tbltree.LFT, Tbltree.RGT) 
    .values("cherries",myright+1,myright+2) 
    .returning(Tbltree.ID) 
    .fetchOne(); 

jOOQ

에 매핑? 해야합니까?

들으

답변

4

나는 당신의 다양한 쿼리가 무엇을하고 있는지 확실히 확실하지 않다, 그래서 명시 적 테이블 잠금이 귀하의 경우 필요 여부를 알 수 없습니다. 하지만 구문을 통해 당신을 도울 수 있습니다.

귀하의 구문에서, 나는 당신이 기본 데이터베이스로 MySQL을 사용하는 것 같아요.

  1. jOOQ에 또한 MySQL을 LOCK TABLES 문을 사용 :

    try { 
        create.execute("LOCK TABLES mytestdb.tbltree WRITE"); 
        // [...] your jOOQ code 
    } 
    
    // Be sure to unlock your tables again, in case of failure! 
    finally { 
        create.execute("UNLOCK TABLES"); 
    } 
    
  2. 사용도 SQL-1992 specification에 의해 지정된 FOR UPDATE 절을, (당신은 jOOQ로 SQL을 번역 적어도 세 가지 옵션이 있습니다 커서 용).

    create.selectFrom(TBLTREE).forUpdate().execute(); 
    
  3. LOCK TABLESUNLOCK TABLES 문에 대한 자신의 org.jooq.Query을 jOOQ을 확장 및 생성 : MySQL이 실제로 Result에 대한 커서를 준비로이 솔루션은 조금 비싼 수 있습니다.