使用Drizzle ORM结合neon-serverless执行事务,无需Pool/Client是否可行?
关于Neon+Drizzle Serverless事务实现的疑问
我在Neon文档中看到,使用事务时应当采用Pool或Client,且这些对象需要在单个请求处理器内完成连接、使用与关闭。但我当前使用drizzle-orm/neon-serverless时并未使用Pool或Client,具体实现如下:
数据库配置(db.ts)
import { drizzle } from 'drizzle-orm/neon-serverless'; import ws from 'ws'; export const db = drizzle({ connection: process.env.DATABASE_URL!, ws: ws, });
事务代码(reserve/page.tsx)
// ... try { await db.transaction(async (tx) => { // 查找可用餐桌 const availableTable = await tx .select() .from(diningTables) .where( and( // 确保餐桌容量足够 gte(diningTables.capacity, Number(guests)), // 确保该餐桌无重叠预订 not( exists( tx .select() .from(reservations) .where( and( eq(reservations.diningTableId, diningTables.id), eq(reservations.reservationDate, date), lt(reservations.startTime, endTime), gt(reservations.endTime, time) ) ) ) ) ) ) .limit(1) .execute() .then((res) => res[0]); if (!availableTable) { throw new Error('No available dining table.'); } // 插入预订记录 await tx .insert(reservations) .values({ diningTableId: availableTable.id, name: name, email: email, notes: notes, reservationDate: date, startTime: time, endTime: endTime }) .execute(); }); } catch (error: unknown) { if (error instanceof Error) { console.error('Error creating reservation:', error.message); } else { console.error('An unexpected error occurred.'); } return; } //...
当前代码可正常工作,能原子性地查找可用餐桌并创建预订,保证事务隔离性。但我想确认该实现方式是否正确,具体疑问如下:
- 是否应改用Pool/Client替代当前的
drizzle-orm/neon-serverless配置? - 当前方案对并发预订是否安全?
- 存在哪些潜在的连接处理问题需要注意?
内容的提问来源于stack exchange,提问作者Ruzaik
相关产品推荐
相关产品推荐

