2017-12-15 64 views
0

MySQL에서 DB 작업을 위해 루프백에 knex를 사용하고 있습니다. 내 작업은 트랜잭션을 사용하여 2 테이블을 업데이트하는 것입니다. 한 탭에 새 항목을 입력하면 두 번째 쿼리 작업에 해당 항목의 ID를 사용하려고합니다.knex 트랜잭션이 nodejs에서 작동하지 않습니다.

그러나 트랜잭션이 오류를 throw하면 두 번째 테이블 항목이 오류를 throw하면 첫 번째 테이블 항목을 제거하거나 데이터를 롤백하지 않습니다. 하지만 내 경우 트랜잭션 항상 내가 아래에있는 내 예제 코드를 넣어 롤백하지 커밋을 수행

addTest : (data) => { 
    return new promise(function(resolve, reject) { 
    knex.transaction(function(t) { 
     return knex('foo') 
     .transacting(t) 
     .insert({ 
      foo_id: data.foo_id ? data.foo_id : null, 
      foo_name: data.foo_name ? data.foo_name : null, 
      date_entered : new Date() 
     }) 
     .then(function() { 
      return knex('bar') 
      .transacting(t) 
      .insert({ 
      bar_id: data.bar_id ? data.bar_id : null, 
      bar_name : data.bar_name ? data.bar_name : null 
      }) 

     }) 
     .then(t.commit) 
     .catch(function(e) { 
      t.rollback(); 
      throw e; 
     })  
    }) 
    .then(function() { 
    // it worked 
    // resolve('sucess'); 
    console.log('success'); 
    }) 
    .catch(function(e) { 
    // it failed 
    console.log('error'+e); 
    }); 
    }); 
} 

이 나에게 적합한 제안을 제공하시기 바랍니다. 고마워요

답변

0

t.commit 또는 t.rollback 번으로 전화하지 않아도됩니다. the docs을 참조하십시오.

는 knex이 커밋을 처리하고 그 약속의 결과 결과에 따라 다시 자신을 압연 할 수 있습니다이

return t.insert({}).into('foo').returning('id') .then(function(idArray) { return t.insert({fooId: idArray[0]}).into('bar') })

같은 트랜잭션 기능 뭔가 내부 코드를 확인합니다. 또한, 어떻게 내가 삽입 된 fooId 가지고 있고 insert 이온에 대한 bar 개체에 적용됩니다. 그것은 그 질문에서 일종의 언급이었습니다.

+0

정의되지 않은 바인딩은 열이 데이터베이스에 없기 때문입니다. 쿼리를 삽입 할 수 없습니다. 나머지는 그 오류 (그리고 당신의 DB 테이블의 정의)를 얻기 위해 사용하는 코드를 보지 않고서는 이해하기가 어렵습니다. – clay

+0

내 코드가 위에 선언되었습니다 –

+0

문서에 따라'knex.transaction (function (t) {'약속을 되 돌린다 (당신처럼), 약속의 해상도에 따라 자동으로't.commit'과't.rollback'을 호출 할 것입니다. 두 번째 질의에서 첫 번째 삽입 된 ID를 사용하지 않음). 자신이't.commit''t.rollback'을 호출하고 약속을 반환하지 않거나 약속 체인을 반환하고 Knex가 트랜잭션의 해결을 처리하도록합니다. – clay