Biblioteka „pg” i tranzakcje

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().