深入学习 ODB(二):连接管理与事务的艺术

系列导航:编译器与注解 | 连接与事务(本文) | 对象关系 | 类型安全查询 | 继承与视图 | 迁移与多库 | 性能与实践 | 实战项目 引言:一次失败的道具购买 某天,游戏服务器日志里出现了一条玩家投诉: “我花了 500 金币买药水,金币扣了但背包里没有药水!” 排查代码发现问题出在这里: 1 2 3 4 5 6 7 8 9 10 11 // 错误示范:非原子操作 void buyItem(Player& player, uint64_t itemId, uint64_t price) { player.deductGold(price); updatePlayerGold(conn, player); // SQL: UPDATE player SET gold=? WHERE id=? // ← 假如这里服务器崩溃了... Item item(itemId, player.id()); insertItem(conn, item); // SQL: INSERT INTO inventory ... } 金币扣除成功提交了,但道具插入还没执行服务器就崩了。数据不一致。 这个问题的根本解法是 事务(Transaction):要么全部成功,要么全部回滚。ODB 用 RAII 语义让事务管理变得优雅且安全——即使代码抛异常,也不会产生"半完成"状态。 1. database 工厂与连接池 1.1 创建数据库连接 ODB 中,odb::database 是所有操作的入口。对于 MySQL 后端: ...

May 31, 2025 · 12 min · 2375 words