mcpField
D
doctrine-transactions

doctrine-transactions

github.com/dev-toolings数据与数据库22798 次安装3 周前更新
代码仓库

关于 doctrine-transactions

doctrine-transactions 是面向 Symfony Doctrine ORM 事务处理的技能,指导服务层划定事务边界、选择锁策略,并处理回滚和冲突。它强调单次 flush、短事务,以及失败后清理并重新获取实体。

主要功能

  1. 01在服务层设置事务边界
  2. 02使用 wrapInTransaction()
  3. 03选择乐观锁或悲观锁
  4. 04处理锁冲突和约束错误
  5. 05回滚后清理并重取实体

适用场景

  1. 01将多项写入作为一个事务提交
  2. 02防止并发编辑覆盖数据
  3. 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 失败、约束冲突或连接断开中恢复。

默认工作流

  1. 将事务边界放在服务层,而不是控制器中。
  2. 在 wrapInTransaction() 内将相关更改组合起来,并只执行一次 flush。
  3. 选择并发策略:编辑时使用 #[ORM\Version] 乐观锁,短暂的关键代码段使用 PESSIMISTIC_WRITE。
  4. 明确处理 OptimisticLockException 和约束冲突。
  5. 回滚后,清空 EntityManager,并重新获取仍需要的数据。

防护措施

  • 在 ORM 3 中,EntityManager::transactional() 已移除:请使用 wrapInTransaction()。
  • 在显式事务之外,每次 flush 都会单独提交,因此应避免在一次操作中多次 flush。
  • 保持事务和悲观锁的持有时间较短;其中不要执行 HTTP 调用或发送邮件。
  • 不要重复使用失败工作单元中的实体。

渐进式披露

  • 使用此文件了解执行原则和风险控制。
  • 需要深入了解实现细节时,请查看参考资料。

输出约定

  • 每次操作只执行一次 flush 的事务边界。
  • 为每个实体选择的锁定策略,以及冲突如何反馈给用户。
  • 回滚处理方式及回滚后 EntityManager 的状态。

参考资料

  • reference.md

评论

支持 Markdown