Hướng dẫn transaction postgresql nodejs - giao dịch postgresql nodejs

Để thực hiện một giao dịch với ứng dụng nút, bạn chỉ cần thực hiện BEGIN / COMMIT / ROLLBACK tự truy vấn thông qua máy khách.Bởi vì các nút nút cố gắng ở mức thấp và không được sử dụng, nên nó không cung cấp bất kỳ sự trừu tượng cao hơn nào cụ thể xung quanh các giao dịch.

Bạn phải sử dụng cùng một thể hiện khách hàng cho tất cả các câu lệnh trong một giao dịch.PostgreSQL phân lập một giao dịch cho các khách hàng cá nhân.Điều này có nghĩa là nếu bạn khởi tạo hoặc sử dụng các giao dịch với phương thức pool. Bạn sẽ gặp vấn đề.Không sử dụng các giao dịch với phương thức Pool.Query.must use the same client instance for all statements within a transaction. PostgreSQL isolates a transaction to individual clients. This means if you initialize or use transactions with the pool.query method you will have problems. Do not use transactions with the pool.query method.

Ví dụ

Một máy khách gộp lại với các cuộc gọi lại

const { Pool } = require('pg')

const pool = new Pool()

pool.connect((err, client, done) => {

const shouldAbort = err => {

if (err) {

console.error('Error in transaction', err.stack)

client.query('ROLLBACK', err => {

if (err) {

console.error('Error rolling back client', err.stack)

}

done()

})

}

return !!err

}

client.query('BEGIN', err => {

if (shouldAbort(err)) return

const queryText = 'INSERT INTO users(name) VALUES($1) RETURNING id'

client.query(queryText, ['brianc'], (err, res) => {

if (shouldAbort(err)) return

const insertPhotoText = 'INSERT INTO photos(user_id, photo_url) VALUES ($1, $2)'

const insertPhotoValues = [res.rows[0].id, 's3.bucket.foo']

client.query(insertPhotoText, insertPhotoValues, (err, res) => {

if (shouldAbort(err)) return

client.query('COMMIT', err => {

if (err) {

console.error('Error committing transaction', err.stack)

}

done()

})

})

})

})

})

Tôi đã bỏ qua bất kỳ thư viện bổ sung nào từ ví dụ cho rõ ràng, nhưng nếu bạn đang sử dụng các cuộc gọi lại, bạn thường sử dụng thư viện điều khiển dòng chảy như Async.

Một khách hàng gộp với async/chờ đợi

Mọi thứ trở nên đơn giản hơn đáng kể nếu bạn đang sử dụng Async/Await:

const { Pool } = require('pg')

const pool = new Pool()

;(async () => {

const client = await pool.connect()

try {

await client.query('BEGIN')

const queryText = 'INSERT INTO users(name) VALUES($1) RETURNING id'

const res = await client.query(queryText, ['brianc'])

const insertPhotoText = 'INSERT INTO photos(user_id, photo_url) VALUES ($1, $2)'

const insertPhotoValues = [res.rows[0].id, 's3.bucket.foo']

await client.query(insertPhotoText, insertPhotoValues)

await client.query('COMMIT')

} catch (e) {

await client.query('ROLLBACK')

throw e

} finally {

client.release()

}

})().catch(e => console.error(e.stack))