Метод lock
Метод lock класса EntityManager
устанавливает блокировку на указанную сущность
в базе данных. Первым параметром передаётся
сущность, которую нужно заблокировать. Вторым
параметром передаётся режим блокировки
(LockMode::PESSIMISTIC_WRITE,
LockMode::PESSIMISTIC_READ или
LockMode::OPTIMISTIC). Третьим
необязательным параметром можно передать
время ожидания блокировки в секундах.
Синтаксис
$em->lock($entity, $lockMode, $lockVersion);
Пример
Давайте создадим сущность Article
и установим на неё пессимистичную блокировку
записи:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMTable(name: 'articles')]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title = '';
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
}
?>
Теперь заблокируем сущность в контроллере:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use DoctrineORMLockMode;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/lock/{id}', name: 'article_lock')]
public function lock(int $id, EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, $id);
if (!$article) {
return new Response('Article not found');
}
$em->lock($article, LockMode::PESSIMISTIC_WRITE);
$em->flush();
return new Response('Article locked');
}
}
?>
Результат выполнения кода для адреса /article/lock/1:
Article locked
Пример
Давайте установим блокировку с таймаутом в 10 секунд:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use DoctrineORMLockMode;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/lock-timeout/{id}', name: 'article_lock_timeout')]
public function lockTimeout(int $id, EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, $id);
if (!$article) {
return new Response('Article not found');
}
$em->lock($article, LockMode::PESSIMISTIC_WRITE, 10);
$em->flush();
return new Response('Article locked with timeout');
}
}
?>
Результат выполнения кода для адреса /article/lock-timeout/1:
Article locked with timeout
Смотрите также
-
класс
EntityManager,
который управляет сущностями и их состоянием -
метод
find,
который находит сущность по идентификатору -
метод
flush,
который синхронизирует изменения с базой данных -
метод
refresh,
который обновляет состояние сущности из базы данных