트랜잭션
SQL 트랜잭션은 데이터베이스와 상호작용하는 하나 이상의 SQL 문을 그룹화한 것입니다. 트랜잭션은 전체적으로 단일 논리 단위로 데이터베이스에 커밋되거나 단일 논리 단위로 롤백(취소)될 수 있습니다.
Drizzle ORM은 트랜잭션에서 SQL 문을 실행하는 API를 제공합니다:
const db = drizzle(...)
await db.transaction(async (tx) => {
await tx.update(accounts).set({ balance: sql`${accounts.balance} - 100.00` }).where(eq(users.name, 'Dan'));
await tx.update(accounts).set({ balance: sql`${accounts.balance} + 100.00` }).where(eq(users.name, 'Andrew'));
});Drizzle ORM은 중첩 트랜잭션 API로 savepoints를 지원합니다:
const db = drizzle(...)
await db.transaction(async (tx) => {
await tx.update(accounts).set({ balance: sql`${accounts.balance} - 100.00` }).where(eq(users.name, 'Dan'));
await tx.update(accounts).set({ balance: sql`${accounts.balance} + 100.00` }).where(eq(users.name, 'Andrew'));
await tx.transaction(async (tx2) => {
await tx2.update(users).set({ name: "Mr. Dan" }).where(eq(users.name, "Dan"));
});
});트랜잭션에 비즈니스 로직을 포함하고 필요할 때 롤백할 수 있습니다:
const db = drizzle(...)
await db.transaction(async (tx) => {
const [account] = await tx.select({ balance: accounts.balance }).from(accounts).where(eq(users.name, 'Dan'));
if (account.balance < 100) {
// 트랜잭션을 롤백하는 예외를 발생시킵니다.
tx.rollback()
}
await tx.update(accounts).set({ balance: sql`${accounts.balance} - 100.00` }).where(eq(users.name, 'Dan'));
await tx.update(accounts).set({ balance: sql`${accounts.balance} + 100.00` }).where(eq(users.name, 'Andrew'));
});트랜잭션에서 값을 반환할 수 있습니다:
const db = drizzle(...)
const newBalance: number = await db.transaction(async (tx) => {
await tx.update(accounts).set({ balance: sql`${accounts.balance} - 100.00` }).where(eq(users.name, 'Dan'));
await tx.update(accounts).set({ balance: sql`${accounts.balance} + 100.00` }).where(eq(users.name, 'Andrew'));
const [account] = await tx.select({ balance: accounts.balance }).from(accounts).where(eq(users.name, 'Dan'));
return account.balance;
});**관계형 쿼리**와 함께 트랜잭션을 사용할 수 있습니다:
const db = drizzle({ schema })
await db.transaction(async (tx) => {
await tx.query.users.findMany({
with: {
accounts: true
}
});
});각 데이터베이스 방언별 트랜잭션 설정 API를 제공합니다:
await db.transaction(
async (tx) => {
await tx.update(accounts).set({ balance: sql`${accounts.balance} - 100.00` }).where(eq(users.name, "Dan"));
await tx.update(accounts).set({ balance: sql`${accounts.balance} + 100.00` }).where(eq(users.name, "Andrew"));
}, {
isolationLevel: "read committed",
accessMode: "read write",
deferrable: true,
}
);
interface PgTransactionConfig {
isolationLevel?:
| "read uncommitted"
| "read committed"
| "repeatable read"
| "serializable";
accessMode?: "read only" | "read write";
deferrable?: boolean;
}