Doctrine таблицы блокировки - PullRequest
0 голосов
/ 09 июля 2020

Я использую Doctrine с Symfony 4.4 .

У меня есть база данных с двумя таблицами:

BookRead: bookid userid

BookWrite: идентификатор пользователя bookid

Пользователь не может читать и писать книгу одновременно. Но пользователи могут читать более одной книги, но одна книга может быть написана одним пользователем одновременно.

У меня есть два класса, один для таблицы, например:

class BookReadRepository extends ServiceEntityRepository
{

   public function __construct(ManagerRegistry $registry)
   {
      parent::__construct($registry, BookRead::class);
   }

   public function query1($user, &$bookRead)
   {
     try
     {
            $this->_em->beginTransaction();
            $query = $this->_em->createQuery
            (
                "SELECT d 
                FROM App\Entity\BookReadd
                WHERE 
                d.bookid= :user
                "
            )
                ->setParameter("user", $user);
            $query->setLockMode(LockMode::PESSIMISTIC_WRITE);
            $dogs= $query->getResult();
        

        } catch (Exception $e)
        {
            return false;
        }
     return true
  }

public function unLock()
    {
        if (!$this->_em->getConnection()->isTransactionActive())
        {
            return true;
        }

        if (!$this->_em->getConnection()->commit())
        {
            return false;
        }
        return true;
    }

}

Запуск кода Speudo :

(new BookReadRepository ($registry))->query1($user, $bookReads);
//checks
(new BookWriteRepository ($registry))->query1($user, $bookWrites);
//checks

 $this->managerRegistry->getManager()->persist($bookWrite); //or bookRead
 $this->managerRegistry->getManager()->flush();

(new BookReadRepository ($registry))->unLock(); 
(new BookWriteRepository ($registry))->unLock(); 

I wi sh, чтобы проверить, не присутствует ли пользователь (с книгой) в другой таблице, чтобы установить его в другой таблице.

Пример:

A -> ask if the user is not on BookRead so insert in the BookWrite.
B -> ask if the user is not on BookWrite so insert in the BookRead.

Проблема:

если A спрашивает, не является ли пользователь Люси BookRead, и подождите, чтобы вставить его в BookWrite, B вставьте в BookRead, потому что Люси нет в BookRead? У меня Люси будет на двух столах.

Моя идея:

In order to insert on BookWrite 
Lock BookRead table -> checks
Lock BookWrite table -> checks and insert on BookWrite 
UnLock BookWrite and BookRead 

In order to insert on BookRead 
Lock BookRead table -> checks
Lock BookWrite table -> checks and insert BookRead 

UnLock BookWrite and BookRead 

Цель: пользователи могут читать более одной книги (на столе для чтения книг), но одна книга может быть написано одним пользователем за раз (в книге записи).

Но мой код не работает, и я не могу понять, как это сделать.

...