关于 doctrine-transactions
doctrine-transactions 是面向 Symfony Doctrine ORM 事务处理的技能,指导服务层划定事务边界、选择锁策略,并处理回滚和冲突。它强调单次 flush、短事务,以及失败后清理并重新获取实体。
主要功能
- 01在服务层设置事务边界
- 02使用 wrapInTransaction()
- 03选择乐观锁或悲观锁
- 04处理锁冲突和约束错误
- 05回滚后清理并重取实体
适用场景
- 01将多项写入作为一个事务提交
- 02防止并发编辑覆盖数据
- 03处理 flush 失败或连接中断
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill doctrine-transactions安装后在 Claude Code 中输入/doctrine-transactions确认已加载。
附带文件reference.md
详细介绍
Doctrine 事务(Symfony)
适用场景
- 多项写入必须同时成功或失败。
- 两个用户或工作进程可能同时编辑同一行。
- 决定在哪里执行 flush,以及由谁负责事务边界。
- 从 flush 失败、约束冲突或连接断开中恢复。
默认工作流
- 将事务边界放在服务层,而不是控制器中。
- 在
wrapInTransaction()内将相关更改组合起来,并只执行一次 flush。 - 选择并发策略:编辑时使用
#[ORM\Version]乐观锁,短暂的关键代码段使用PESSIMISTIC_WRITE。 - 明确处理
OptimisticLockException和约束冲突。 - 回滚后,清空 EntityManager,并重新获取仍需要的数据。
防护措施
- 在 ORM 3 中,
EntityManager::transactional()已移除:请使用wrapInTransaction()。 - 在显式事务之外,每次 flush 都会单独提交,因此应避免在一次操作中多次 flush。
- 保持事务和悲观锁的持有时间较短;其中不要执行 HTTP 调用或发送邮件。
- 不要重复使用失败工作单元中的实体。
渐进式披露
- 使用此文件了解执行原则和风险控制。
- 需要深入了解实现细节时,请查看参考资料。
输出约定
- 每次操作只执行一次 flush 的事务边界。
- 为每个实体选择的锁定策略,以及冲突如何反馈给用户。
- 回滚处理方式及回滚后 EntityManager 的状态。
参考资料
reference.md
评论
支持 Markdown