2014-12-04 2 views
2

Postgres를 데이터베이스로 사용하여 Sails 0.10.5에서 트랜잭션을 구현하려하지만 작업이 끝에 커밋 (또는 롤백)되지 않습니다.Sails.js + Postgres : 거래 관련 문제

이 내가 테스트 적어 놓은 간단한 트랜잭션 시나리오 (사용 async.js)입니다 : 다음

testTransaction: function(uri) { 

    var testFile = { 
     uri: uri, 
     details: { 'firstDetail': 'value' } 
    }; 

    async.auto({ 
     begin_transaction: function(callback) { 
      DataFile.query('BEGIN TRANSACTION;', callback); 
     }, 
     new_data_file: ['begin_transaction', function(callback) { 
      DataFile.create(testFile).exec(callback); 
     }], 
    }, function(error, results) { 
     if (error) { 
      console.log(error.message); 
      DataFile.query('ROLLBACK;', function(e, r) { 
       return error.message; 
      }); 
      return; 
     } 
     DataFile.query('COMMIT;', function(e, r) { 
      console.log("Saved file: " + results.new_data_file); 
      if (e) { 
       return "Error during commit"; 
      } 
      return results.new_data_file; 
     }); 
    }); 

} 

내가 오류없이 서비스를 실행; Postgres 테이블에는 새로운 DataFile 엔티티가 추가되지 않습니다.

2014-12-04 10:35:01 GMT 7984 548038d0.1f30LOG: statement: BEGIN TRANSACTION; 
2014-12-04 10:35:01 GMT 7977 548038d0.1f29LOG: execute <unnamed>: INSERT INTO "data_file" ("uri", "details", "created_at", "updated_at") values ($1, $2, $3, $4) RETURNING * 
2014-12-04 10:35:01 GMT 7977 548038d0.1f29DETAIL: parameters: $1 = '/just/another/test/uri', $2 = '{"firstDetail":"value"}', $3 = '2014-12-04 10:35:01+00', $4 = '2014-12-04 10:35:01+00' 
2014-12-04 10:35:01 GMT 7983 548038d0.1f2fLOG: statement: COMMIT; 
2014-12-04 10:35:01 GMT 7983 548038d0.1f2fWARNING: there is no transaction in progress 

그래서 내가 경고를 얻을 : 나는 포스트 그레스 로그를 확인하면 나는 것을 발견 로그에 세 번째 요소는 프로세스 ID입니다 "어떤 트랜잭션이 진행 없다". 분명히 COMMIT 문은 BEGIN (7984)을 발행 한 프로세스와 다른 프로세스 (7983)에 의해 발행됩니다. 이것이 문제가 될 수 있습니까? Sails에서 트랜잭션을 처리 할 때 동일한 프로세스를 사용하도록 강제로 설정할 수 있습니까?

답변

0

트랜잭션은 동일한 연결로 여러 쿼리를 사용하지만 모든 쿼리에 대해 워터 라인이 다른 연결을 사용하므로 "진행중인 트랜잭션이 없습니다"라는 메시지가 표시됩니다. 두 번째 쿼리는 다른 연결은 진행중인 트랜잭션이 없습니다.

poolSize을 1로 설정하는 것 외에는이 방법을 사용할 수 없습니다 (모든 쿼리가 동일한 연결을 사용해야 함).

여기 거래 용 라이브러리 - https://github.com/Shyp/pg-transactions입니다. 도우미 메서드 (.find(), .update() 등)에 액세스 할 수는 없지만 최소한 가능합니다.