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);
});
});
}
이 나에게 적합한 제안을 제공하시기 바랍니다. 고마워요
정의되지 않은 바인딩은 열이 데이터베이스에 없기 때문입니다. 쿼리를 삽입 할 수 없습니다. 나머지는 그 오류 (그리고 당신의 DB 테이블의 정의)를 얻기 위해 사용하는 코드를 보지 않고서는 이해하기가 어렵습니다. – clay
내 코드가 위에 선언되었습니다 –
문서에 따라'knex.transaction (function (t) {'약속을 되 돌린다 (당신처럼), 약속의 해상도에 따라 자동으로't.commit'과't.rollback'을 호출 할 것입니다. 두 번째 질의에서 첫 번째 삽입 된 ID를 사용하지 않음). 자신이't.commit''t.rollback'을 호출하고 약속을 반환하지 않거나 약속 체인을 반환하고 Knex가 트랜잭션의 해결을 처리하도록합니다. – clay