인터페이스: Transaction<T>
정의 위치: packages/db/src/transactions.ts:304
타입 매개변수
T
T extends object = Record<string, unknown>
속성
autoCommit
autoCommit: boolean;
정의 위치: packages/db/src/transactions.ts:322
createdAt
createdAt: Date;
정의 위치: packages/db/src/transactions.ts:323
error?
optional error: object;
정의 위치: packages/db/src/transactions.ts:326
error
error: Error;
message
message: string;
id
id: string;
정의 위치: packages/db/src/transactions.ts:305
isPersisted
isPersisted: Deferred<Transaction<T>>;
정의 위치: packages/db/src/transactions.ts:321
이 트랜잭션이 확정될 때 완료되는 Deferred입니다.
isPersisted.promise를 await해야 하며 isPersisted 자체를 await하면 안 됩니다. 이 프로미스는
트랜잭션이 성공적으로 완료되면 이행되고, 트랜잭션이
실패하거나 롤백되면 거부됩니다.
비어 있지 않은 커밋의 경우 뮤테이션 함수가 일반적인 확정 경계입니다. 뮤테이션 함수가 반환하기 전에 해당 백엔드 관찰을 기다리지 않는 한, 이것만으로 백엔드가 쓰기를 업로드했거나 확인했거나 다시 읽었다는 사실이 본질적으로 입증되지는 않습니다.
메타데이터
metadata: Record<string, unknown>;
정의 위치: packages/db/src/transactions.ts:325
mutationFn
mutationFn: MutationFn<T>;
정의 위치: packages/db/src/transactions.ts:307
mutations
mutations: PendingMutation<T, OperationType, Collection<T, any, any, any, any>>[];
정의 위치: packages/db/src/transactions.ts:308
sequenceNumber
sequenceNumber: number;
정의 위치: packages/db/src/transactions.ts:324
state
state: TransactionState;
정의 위치: packages/db/src/transactions.ts:306
메서드
applyMutations()
applyMutations(mutations): void;
정의 위치: packages/db/src/transactions.ts:459
이 트랜잭션에 새 뮤테이션을 적용하고 기존 뮤테이션과 지능적으로 병합합니다
뮤테이션이 동일한 항목(동일한 globalKey)에서 작동하는 경우 다음 규칙에 따라 병합됩니다:
- insert + update → insert (변경 사항을 병합하고 비어 있는 원본을 유지)
- insert + delete → removed (뮤테이션이 서로 상쇄됨)
- update + delete → delete (delete가 우선함)
- update + update → update (변경 사항을 합집합하고 첫 번째 원본을 유지)
- 동일한 유형 → 최신 항목으로 대체
이 병합은 네트워크 전송 변경을 줄이고 낙관적 로컬 뷰를 사용자 의도에 맞게 유지합니다.
매개변수
mutations
PendingMutation<any, OperationType, Collection<any, any, any, any, any>>[]
적용할 새 뮤테이션의 배열입니다
반환값
void
commit()
commit(): Promise<Transaction<T>>;
정의 위치: packages/db/src/transactions.ts:616
트랜잭션을 커밋하고 뮤테이션 함수를 실행합니다
반환값
Promise<Transaction<T>>
완료되면 이 트랜잭션으로 해결되는 Promise입니다
예제
// Manual commit (when autoCommit is false)
const tx = createTransaction({
autoCommit: false,
mutationFn: async ({ transaction }) => {
await api.saveChanges(transaction.mutations)
}
})
tx.mutate(() => {
collection.insert({ id: "1", text: "Buy milk" })
})
await tx.commit() // Manually commit
// Handle commit errors
try {
const tx = createTransaction({
mutationFn: async () => { throw new Error("API failed") }
})
tx.mutate(() => {
collection.insert({ id: "1", text: "Item" })
})
await tx.commit()
} catch (error) {
console.log('Commit failed, transaction rolled back:', error)
}
// Check transaction state after commit
await tx.commit()
console.log(tx.state) // "completed" or "failed"
compareCreatedAt()
compareCreatedAt(other): number;
정의 위치: packages/db/src/transactions.ts:670
생성된 순서대로 정렬하기 위해 createdAt 시간과 sequence number를 기준으로 두 트랜잭션을 비교합니다.
매개변수
other
Transaction<any>
비교할 다른 트랜잭션
반환값
number
이 트랜잭션이 다른 트랜잭션보다 먼저 생성되었으면 -1, 나중에 생성되었으면 1, 동시에 생성되었으면 0
mutate()
mutate(callback): Transaction<T>;
정의 위치: packages/db/src/transactions.ts:409
이 트랜잭션 내에서 컬렉션 작업을 실행합니다
매개변수
callback
() => void
함께 그룹화할 컬렉션 작업을 포함하는 동기 함수입니다.
트랜잭션 컨텍스트는 이 콜백의 동기 실행 시간 동안에만 활성 상태입니다.
비동기 작업은 mutationFn에서 수행해야 합니다. 이 콜백 내부의 await 경계를 지난 후 컬렉션 작업은
이 트랜잭션에 포함되지 않습니다. 수동 트랜잭션의 경우 커밋하기 전에 mutate를 여러 번 호출하여
동일한 트랜잭션에 동기 작업을 추가합니다.
반환값
Transaction<T>
연결을 위한 이 트랜잭션
예제
// Group multiple operations
const tx = createTransaction({ mutationFn: async () => {
// Send to API
}})
tx.mutate(() => {
collection.insert({ id: "1", text: "Buy milk" })
collection.update("2", draft => { draft.completed = true })
collection.delete("3")
})
await tx.isPersisted.promise
// Handle mutate errors
try {
tx.mutate(() => {
collection.insert({ id: "invalid" }) // This might throw
})
} catch (error) {
console.log('Mutation failed:', error)
}
// Manual commit control
const tx = createTransaction({ autoCommit: false, mutationFn: async () => {} })
tx.mutate(() => {
collection.insert({ id: "1", text: "Item" })
})
// Add more synchronous mutations to the same transaction
tx.mutate(() => {
collection.update("1", draft => { draft.text = "Updated item" })
})
// Commit later when ready
await tx.commit()
rollback()
rollback(config?): Transaction<T>;
정의 위치: packages/db/src/transactions.ts:533
트랜잭션과 충돌하는 모든 트랜잭션을 롤백합니다
매개변수
config?
롤백 동작의 구성입니다
isSecondaryRollback?
boolean
반환값
Transaction<T>
연결을 위한 이 트랜잭션
예제
// Manual rollback
const tx = createTransaction({ mutationFn: async () => {
// Send to API
}})
tx.mutate(() => {
collection.insert({ id: "1", text: "Buy milk" })
})
// Rollback if needed
if (shouldCancel) {
tx.rollback()
}
// Handle rollback cascade (automatic)
const tx1 = createTransaction({ mutationFn: async () => {} })
const tx2 = createTransaction({ mutationFn: async () => {} })
tx1.mutate(() => collection.update("1", draft => { draft.value = "A" }))
tx2.mutate(() => collection.update("1", draft => { draft.value = "B" })) // Same item
tx1.rollback() // This will also rollback tx2 due to conflict
// Handle rollback in error scenarios
try {
await tx.isPersisted.promise
} catch (error) {
console.log('Transaction was rolled back:', error)
// Transaction automatically rolled back on mutation function failure
}
setState()
setState(newState): void;
정의 위치: packages/db/src/transactions.ts:352
매개변수
newState
반환값
void
touchCollection()
touchCollection(): void;
정의 위치: packages/db/src/transactions.ts:561
반환값
void