РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
17 of 258 menu

Метод 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,
    который обновляет состояние сущности из базы данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить