Некоторые операции в базах данных должны быть выполнены как единое целое. Если одна из операций неудачна, то все остальные откатываются и база данных сохраняет свое исходное состояние. Это называется транзакция.
Транзакции обеспечивают целостность данных, управление параллельным доступом к данным и обеспечивают исключение избыточного чтения и записи.
Для выполнения транзакций в библиотеке есть специальный метод transaction()
:
import { createPool, sql } from 'slonik'
const pool = await createPool(uri)
pool.connect(async (connection) => {
const result = await connection.transaction(async (transactionConnection) => {
const user = {
username: 'Tony Stark',
phone: '+123456789',
}
const userId = await transactionConnection.oneFirst(sql.typeAlias('id')`
INSERT INTO users (username, phone) VALUES (${user.username}, ${user.phone}) RETURNING id
`)
const taskId = await transactionConnection.oneFirst(sql.typeAlias('id')`
INSERT INTO tasks(userId, text) VALUES (${userId}, 'Перекусить') RETURNING id
`)
return { userId, taskId }
})
console.log(result) // { userId, taskId }
})
Функция принимает колбек, в который передается функция для выполнения запросов. Это обеспечивает гарантию, что все запросы выполняться на одном соединении. При необходимости, из колбека можно вернуть данные.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.