2012-02-16 13 views
5

Mamy istniejącej bazy danych SQL, a Piszę serwer node.js, która uzyskuje dostęp to za pomocą prostego języka SQL, przy użyciu tego modułu sterownika postgres:node.js + Postgres zarządzania transakcjami w bazie

https://github.com/brianc/node-postgres

Do tej pory nie mogę znaleźć modułu węzła zarządzania transakcjami, który współpracuje z PostgreSQL. Czy ktoś wie o jednym? Najlepiej z pewnym praktycznym użyciem?

Po drugie, na wyższym poziomie, oceniamy, czy plik node.js rzeczywiście może zastąpić Javę jako rzeczywiste rozwiązanie dla serwera, który może obsługiwać wolumin. Zarządzanie transakcjami było jednym z problemów, które musieliśmy rozwiązać. A więc wgląd w to byłby przydatny.

Na razie wydaje się po prostu SQL BEGIN na początku żądania serwera węzła i ROLLBACK lub COMMIT na końcu. Jednak jestem (być może oczywiście) nieobeznany z rzeczywistymi problemami związanymi z zarządzaniem transakcjami SQL. Jeśli ktoś mógłby pokrótce wyjaśnić problemy, które rozwiązują frameworki zarządzania transakcjami, byłby przydatny.

EDYCJA: Korzystam z wbudowanego mechanizmu łączenia połączeń sterownika postgres, a wszystkie zapytania w ramach żądania http są wysyłane w tym samym połączeniu, które otrzymano z puli. Najpierw wydaje się BEGIN, a następnie dowolne konkretne żądanie HTTP, a następnie COMMIT lub ROLLBACK.

Dzięki.

Odpowiedz

3

Zarządzanie transakcjami to dość duży temat. Za to, co sobie wyobrażam, robisz, będziesz chciał użyć trybu AUTOCOMMIT. Zasadniczo oznacza to, że będziesz polegał na PostgreSQL, aby BEGIN/COMMIT zawierał wszystkie twoje instrukcje (lub innymi słowy, że wszystkie twoje instrukcje będą działały w ich własnej transakcji bez żadnego powiązania). Łatwym sposobem, aby zdecydować, że tryb AUTOCOMMIT jest odpowiedni dla Ciebie, jest decyzja, że ​​nie musisz używać ROLLBACK. Ogromną zaletą trybu AUTOCOMMIT jest to, że nawet najgłupsze narzędzie do łączenia połączeń nie może zepsuć się.

Aby uzyskać szczegółowe informacje na temat zarządzania transakcjami, zacznij od spojrzenia na http://www.postgresql.org/docs/9.1/static/transaction-iso.html Co robisz, upewnij się, że nie używasz ani nie piszesz naiwnej platformy, która pozostawia Cię w obszarze "IDLE w transakcji". I wreszcie, od kiedy wspomniałeś o "dużej głośności", powinienem zapytać, jaki jest twój bilans czytania. Jeśli zdecydowanie sprzyja to czytaniu, powinieneś rozważyć napisanie swojego kodu, aby użyć memcached. Najprostszy (ale daleki od najskuteczniejszej) sposób, aby to zrobić, to użyć PQC.

+0

Dzięki za wszystkie informacje. Potrzebujemy ROLLBACK, ponieważ nasze żądania wysyłają szereg instrukcji aktualizacji, które muszą być jednostkami atomowymi. Spojrzę na ten dokument i PQC. – Jake

3

pg-promise biblioteka zajmuje się zarządzaniem transakcji ładnie:

db.tx(t => { 
     return t.batch([ 
      t.query('UPDATE users SET active = $1 WHERE id = $2', [true, 123]), 
      t.query('INSERT INTO audit(event, id) VALUES($1, $2)', ['activate', 123]) 
     ]); 
    }) 
    .then(data => { 
     // success; 
    }) 
    .catch(error => { 
     // error; 
    }); 
+0

Czy wiesz, jak ustawić poziom transakcji za pomocą tej metody? – Derek

+0

@Derek Zobacz [Konfigurowalne transakcje] (https://github.com/vitaly-t/pg-promise#configurable-transactions) –

+0

Dzięki za niesamowitą bibliotekę vitaly-t !!! – Derek

0

Poszukaj Sequelize http://docs.sequelizejs.com/en/latest/api/transaction/

Możliwe poziomy izolacji używać podczas uruchamiania transakcji:

{ 
    READ_UNCOMMITTED: "READ UNCOMMITTED", 
    READ_COMMITTED: "READ COMMITTED", 
    REPEATABLE_READ: "REPEATABLE READ", 
    SERIALIZABLE: "SERIALIZABLE" 
} 

przepustkę pożądany poziom jako pierwszy argument:

return sequelize.transaction({ 
    isolationLevel: Sequelize.Transaction.SERIALIZABLE 
}, function (t) { 

// your transactions 

}).then(function(result) { 
    // transaction has been committed. Do something after the commit if required. 
}).catch(function(err) { 
    // do something with the err. 
}); 
Powiązane problemy