Я использую 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
Цель: пользователи могут читать более одной книги (на столе для чтения книг), но одна книга может быть написано одним пользователем за раз (в книге записи).
Но мой код не работает, и я не могу понять, как это сделать.