W bibliotece pg w języku JavaScript, można użyć transakcji za pomocą client.query() lub pool.query() w połączeniu z metodą BEGIN i COMMIT lub ROLLBACK w zapytaniach SQL.
Poniżej przedstawiam przykład użycia transakcji za pomocą metody client.query():
const { Client } = require('pg');
const client = new Client({
user: 'dbuser',
host: 'database.server.com',
database: 'mydatabase',
password: 'secretpassword',
port: 5432,
});
(async () => {
await client.connect();
try {
await client.query('BEGIN');
await client.query('UPDATE accounts SET balance = balance - 100 WHERE id = 1');
await client.query('UPDATE accounts SET balance = balance + 100 WHERE id = 2');
await client.query('COMMIT');
console.log('Transaction completed successfully!');
} catch (e) {
await client.query('ROLLBACK');
console.log('Transaction failed!');
} finally {
await client.end();
}
})();
W powyższym przykładzie, wykorzystując metodę client.query() wykonujemy operacje na dwóch wierszach tabeli accounts w ramach jednej transakcji. Jeśli wszystkie zapytania zostaną wykonane pomyślnie, to transakcja zostanie zatwierdzona za pomocą polecenia COMMIT. Jeśli którykolwiek z zapytań się nie powiedzie, transakcja zostanie anulowana za pomocą polecenia ROLLBACK.
Zamiast client.query(), możemy użyć również metody pool.query(), aby uzyskać połączenie z pulą połączeń, ale sposób użycia transakcji jest taki sam. W przypadku transakcji zawsze należy wywołać COMMIT lub ROLLBACK na końcu transakcji, aby zwolnić blokadę i pozwolić na dostęp do danych przez inne połączenia.
Oto przykład użycia transakcji z metodą pool.query():
const { Pool } = require('pg');
const pool = new Pool({
user: 'dbuser',
host: 'database.server.com',
database: 'mydatabase',
password: 'secretpassword',
port: 5432,
});
(async () => {
const client = await pool.connect();
try {
await client.query('BEGIN');
await client.query('UPDATE accounts SET balance = balance - 100 WHERE id = 1');
await client.query('UPDATE accounts SET balance = balance + 100 WHERE id = 2');
await client.query('COMMIT');
console.log('Transaction completed successfully!');
} catch (e) {
await client.query('ROLLBACK');
console.log('Transaction failed!');
} finally {
client.release();
}
})();
W powyższym przykładzie używamy metody pool.connect() do uzyskania połączenia z pulą połączeń, a następnie wykonujemy zapytania SQL za pomocą metody client.query(). W przypadku transakcji zawsze należy wywołać COMMIT lub ROLLBACK na końcu transakcji, aby zwolnić blokadę i pozwolić na dostęp do danych przez inne połączenia.
Po wykonaniu zapytań SQL, musimy ręcznie zwolnić połączenie do puli połączeń, aby umożliwić jego ponowne użycie przez innych klientów, dlatego używamy client.release().