【问题标题】:Get transaction ID from doctrine从学说中获取交易 ID
【发布时间】:2023-01-08 04:18:00
【问题描述】:
我想获取当前正在运行的事务的事务 ID。
这是我的代码:
$con = $entityManager->getConnection();
$con->beginTransaction();
$entity = new Entity(); .....
$entityManager->persist($entity);
$entityManager->flush();
$con->commit();
我找不到任何获取 ID 的方法...只有运行本机 SQL 才能解决这个问题,但我认为这不合适
【问题讨论】:
标签:
postgresql
symfony
doctrine
【解决方案1】:
我假设您使用的是 Doctrine 的默认设置,因此它将在下面使用 PHP PDO。看起来 PDO 没有解析事务 ID 的能力——可能是因为每个 DBMS 都不同,所以它不是 ANSI SQL。
看看PDO::beginTransaction() documentation,它只返回布尔值。此外,没有其他功能可以检索 ID。
您必须执行原始 SQL,这可能还不错。我知道很多人认为 ORM/DBAL 将允许在未来更改数据库引擎,但是 - 根据我的经验,YMMV - 我总是使用一些特定于引擎的行为。由于在处理空值和默认值方面存在细微差异,即使运行 SQLite 而不是 MySQL 进行测试有时也会失败。
要在 PostgreSQL 中获取事务 ID:
$con = $entityManager->getConnection();
$query = $con->executeQuery('SELECT txid_current()');
$transactionId = $query->fetchOne();