尝试在Doctrine的DBAL中使用咨询锁时遇到一种非常奇怪的行为。

我有一个Symfony 2应用程序,我想在其中获取某些实体的咨询锁。 我正在执行以下查询来获取锁:

SELECT pg_try_advisory_lock(83049, 5)

通过PHP中的以下代码:

/** @var Doctrine\DBAL\Connection  */
protected $connection;

public function lock()
{
    return $this->connection->fetchColumn(
        "SELECT pg_try_advisory_lock({$this->getTableOid()}, {$this->entity->getLockingId()})"
    );
}

我创建了以下脚本来测试并发性:

// Obtaining the lock.
$locker->lock();

// Doing something for ten seconds.
sleep(10); 

但是,当我同时运行它时,似乎每个实例都成功获取了锁。 同样,在请求终止后,即使我没有调用unlock() ,锁也似乎自动释放。

为什么会这样呢?

原则是否对所有请求都使用单一连接?

脚本终止后,学说会自动释放锁吗?

#1楼 票数:0

13.3.4。 咨询锁

PostgreSQL提供了一种创建具有应用程序定义含义的锁的方法。 这些被称为咨询锁,因为系统不会强制使用它们-取决于应用程序是否正确使用它们。 咨询性锁定对于不适用于MVCC模型的锁定策略很有用。 例如,咨询锁的常用用法是模拟所谓的“平面文件”数据管理系统特有的悲观锁策略。 虽然存储在表中的标志可以用于相同的目的,但咨询锁更快,可以避免表膨胀,并在会话结束时由服务器自动清除。

在PostgreSQL中有两种获取咨询锁的方法:在会话级别或在事务级别。 一旦在会话级别获取,将保持咨询锁,直到明确释放或会话结束为止。 与标准锁请求不同,会话级咨询锁请求不遵循事务语义:在回滚后的事务中获取的锁在回滚后仍将保留,并且即使调用事务稍后失败,解锁同样有效。 锁可以通过其拥有的过程多次获得; 对于每个完成的锁请求,在实际释放锁之前必须有一个相应的解锁请求。 另一方面,事务级别的锁定请求的行为更类似于常规锁定请求:它们在事务结束时自动释放,并且没有显式的解锁操作。 对于短期使用咨询锁,此行为通常比会话级行为更方便。 对同一咨询锁标识符的会话级和事务级锁请求将以预期的方式彼此阻塞。 如果一个会话已经拥有给定的咨询锁,则即使其他会话正在等待该锁,它的其他请求也将始终成功; 无论现有的锁保持和新请求是在会话级别还是在事务级别,此语句都是正确的。

http://www.postgresql.org/docs/9.1/static/explicit-locking.html

  ask by Slava Fomin II translate from so

未解决问题?本站智能推荐:

1回复

在Symfony中使用Doctrine的DBAL检索布尔值

我在Symfony项目中使用DBAL来访问Mysql数据库中的数据。 当使用布尔字段查询表(创建为tinyint)时,我在PHP中得到tinyint值,但我想得到布尔值。 不知何故,我想直接使用与Doctrine相同的映射。 我认为映射转换(从mysql到php)已经在DBAL中实
1回复

克隆Dbal连接,用于在重复的Get_Affected_Rows上执行插入

我正在使用Doctrine DBAL,并希望在返回值被影响的行上INSERT ... ON DUPLICATE UPDATE 。 好像您不能使用标准的Dbal executeUpdate,因为INSERT ... ON DUPLICATE UPDATE和受影响的行是MySQL特定的。 这迫使
1回复

迭代DBAL原则

我试图用dbal连接将一列向上计数。 这是我得到的错误: 我怎样才能做到这一点? 谢谢
1回复

Symfony2:与DBAL等效于flush()/ perist()

我想知道是否有与DBAL等效的$ em-> persist($ entity)或$ em-> flush()? 我的意思是,DBAL如何与实体合作? 我正在使用非学说处理的实体:使用SELECT ...使用DBAL检索到水合实体的数据,如果我必须更新数据库中的内容,是否必须使
5回复

使用多个连接时自动装配特定的 DBAL 连接

我正在使用 Doctrine 2,其中我有多个 DBAL 连接。 我在 ORM 中也有多个 EntityManager。 我需要能够以某种方式将特定的 DBAL 连接自动连接到其他 Symfony 3 服务中。 我可以使用 EntityManagerDecorator 自动装配任何 Entiti
1回复

如何在DBAL中为自定义类型映射定义长度?

我在https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/cookbook/custom-mapping-types.html之后定义了一个自定义映射,它可以工作,但我需要make:entity来询问类型的长度,与字符串的长度
2回复

将参数设置为int数组,用于dbal查询生成器中的where语句将数组抛出到字符串转换异常

我尝试在WHERE IN语句中的dbal querybuilder中绑定参数:[1,2] 我试图将$qb->expr()->in()改为字符串版本,但没有改变 QueryBuilder创建 $qb = $this->_em->getConnection()-
1回复

mysql tinyint(2)映射为boolean与doctrine不正确

我用symfony2和doctrine用命令反向设计我的数据库: 但我的字段被映射为布尔值而不是tinyint(2)。 为什么它映射为布尔值?