我可以在具有数据库锁定的不同服务中使用自动装配的 EntityManager 吗?
Can I use autowired EntityManager across different services with DB locking?
在我的 Symfony 5 项目中,我有 2 个服务,我将 EntityManager
自动连接到这两个服务中:
class MyService1 {
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
// ...
}
和
class MyService2 {
public function __construct(EntityManagerInterface $entityManager, MyService1 $myService1)
{
$this->entityManager = $entityManager;
$this->myService1 = $myService1;
}
// ...
}
我 运行 MyService2
函数之一内的一些数据库事务:
$this->entityManager->getConnection()->beginTransaction();
我从 MyService1
调用了一些辅助函数,它也使用它自己的 $entityManager
属性 并且也应该在同一个数据库事务中执行。
我的问题是:我是否保证这两个服务将自动连接到 $entityManager
的相同(唯一)实例?这很重要,因为我需要它们都在同一个数据库锁定范围内工作。
我确实使用 dump()
函数对其进行了实验性测试,它们似乎确实指向同一个实例。但是我没有在文档中找到这是否是一个确定的行为,或者某些不能保证发生的随机缓存的结果。
谢谢!
是的,您可以预期它是同一个实例。自动装配的实例在整个应用程序中是相同的。只要您使用默认连接,使用 Entity Manager 实例启动的事务在不同服务中都是相同的。
这基本上就是 Dependency Injection 背后的想法。只有一个实例,它正在被下游服务共享。
从历史上看设计模式,这是“单例”范式的扩展,您将拥有一个带有静态实例化器的全局 class。使用依赖注入,实例由 DI 容器管理,但它始终是相同(相同)的对象。
顺便说一下,锁与事务不同。事务仅在您当前连接的范围内有效,而锁会影响所有连接,直到它被释放。
在我的 Symfony 5 项目中,我有 2 个服务,我将 EntityManager
自动连接到这两个服务中:
class MyService1 {
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
// ...
}
和
class MyService2 {
public function __construct(EntityManagerInterface $entityManager, MyService1 $myService1)
{
$this->entityManager = $entityManager;
$this->myService1 = $myService1;
}
// ...
}
我 运行 MyService2
函数之一内的一些数据库事务:
$this->entityManager->getConnection()->beginTransaction();
我从 MyService1
调用了一些辅助函数,它也使用它自己的 $entityManager
属性 并且也应该在同一个数据库事务中执行。
我的问题是:我是否保证这两个服务将自动连接到 $entityManager
的相同(唯一)实例?这很重要,因为我需要它们都在同一个数据库锁定范围内工作。
我确实使用 dump()
函数对其进行了实验性测试,它们似乎确实指向同一个实例。但是我没有在文档中找到这是否是一个确定的行为,或者某些不能保证发生的随机缓存的结果。
谢谢!
是的,您可以预期它是同一个实例。自动装配的实例在整个应用程序中是相同的。只要您使用默认连接,使用 Entity Manager 实例启动的事务在不同服务中都是相同的。
这基本上就是 Dependency Injection 背后的想法。只有一个实例,它正在被下游服务共享。
从历史上看设计模式,这是“单例”范式的扩展,您将拥有一个带有静态实例化器的全局 class。使用依赖注入,实例由 DI 容器管理,但它始终是相同(相同)的对象。
顺便说一下,锁与事务不同。事务仅在您当前连接的范围内有效,而锁会影响所有连接,直到它被释放。