gpt4 book ai didi

symfony - 如何在 DQL 查询中更改 LockMode,在 SQL Server 的 Doctrine 2 中

转载 作者:行者123 更新时间:2023-12-05 05:24:07 25 4
gpt4 key购买 nike

我需要更改 LockMode 以使 Doctrine 将“with(nolock)”行为添加到我在查询中使用的表中。

我会更好地解释这一点:

我有什么:

SELECT e FROM Project:Example e

当 Doctrine 创建和执行 SQL 时,我想从它那里得到什么:

SELECT e FROM example e WITH(NOLOCK)

我无法在任何地方找到更改 LOCKMODE 的方法,这变得很痛苦。

我尝试打开一个事务并执行 setLockMode(LockMode::NONE) 但它只是在第一个表之后添加了 with(nolock) ( FROM 子句),我需要将其添加到每个表(JOIN 上的表)中。

我真正拥有的是:

SELECT e, o FROM Project:Example e JOIN e.owner o

我做了什么:

  $dql='SELECT e, o FROM Porject:Example e JOIN e.owner o';
$query = $this->getEntityManager()->createQuery($dql);
try{
$this->getEntityManager()->getConnection()->beginTransaction();
$result = $query ->setLockMode(LockMode::NONE)->getSQL();
$this->getEntityManager()->getConnection()->commit();
} catch (\Exception $e) {
$this->getEntityManager()->getConnection()->rollback();
throw $e;
}

作为$result:

SELECT c0_.prop1, c0_.prop2, c1_.prop1, c1_.prop2 
FROM examples c0_ WITH(NOLOCK)
INNER JOIN owners c1_ ON c1_.id= c0_ownerId`

我期待的是:

SELECT c0_.prop1, c0_.prop2, c1_.prop1, c1_.prop2 
FROM examples c0_ WITH(NOLOCK)
INNER JOIN owners c1_ WITH(NOLOCK) ON c1_.id= c0_ownerId`

注意双 WITH(NOLOCK)

可能的解决方案:

try {
$this->getEntityManager()->getConnection()->beginTransaction();
$this->getEntityManager()->getConnection()->setTransactionIsolation(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED);
$result = $query->getArrayResult();
$this->getEntityManager()->getConnection()->commit();
} catch (\Exception $e) {
$this->getEntityManager()->getConnection()->rollback();
throw $e;
}

但我不确定使用 with(nolock) 是否与使用 READ_UNCOMMITTED 隔离级别 相同。 p>

将@chalasr 的答案设置为已接受的答案。创建了另一个问题来解决实际问题:How perform lockmode:none on associations (join) with Doctrine2 and SQL Server

仅供引用。

最佳答案

有 4 个不同的 LockMode :

const NONE = 0;
const OPTIMISTIC = 1;
const PESSIMISTIC_READ = 2;
const PESSIMISTIC_WRITE = 4;

documentation中找到最合适的并像这样使用:

$query = $em->createQuery('SELECT e FROM Porject:Example e');
$query->setLockMode(LockMode::NONE);

关于symfony - 如何在 DQL 查询中更改 LockMode,在 SQL Server 的 Doctrine 2 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com