用途:当多个写入必须一起成功或失败、两个用户或 worker 并发编辑同一行、需要决定在哪里 flush 以及谁拥有事务边界、或在 flush 失败、约束冲突、连接丢失后恢复时使用。
主要能力:在服务层而非控制器放置事务边界;把相关变更分组并在 wrapInTransaction() 内只 flush 一次;选择并发策略,编辑用 #[ORM\Version] 乐观锁,短临界区用 PESSIMISTIC_WRITE;显式处理 OptimisticLockException 与约束冲突;回滚后清空 EntityManager 并重新获取仍需的数据。
使用方式:按默认工作流执行,事务边界放在服务层,相关变更分组后于 wrapInTransaction() 内单次 flush,按实体选择锁策略并让冲突反馈到用户,处理回滚及回滚后 EntityManager 状态。需要深层实现细节时打开 references(reference.md)。
限制与护栏:ORM 3 中 EntityManager::transactional() 已移除,须用 wrapInTransaction();显式事务之外每次 flush 各自提交,避免一次操作多次 flush;事务与悲观锁保持短小,内部不做 HTTP 调用或发邮件;不要复用失败工作单元中的实体。输出契约要求给出事务边界与每操作单次 flush、按实体选择的锁策略及冲突如何到达用户、回滚处理与回滚后 EntityManager 状态。