我在symfony2中有一个文档管理系统。 一旦用户建立了我的文档实体,它将被分配一个序列号。symfony2如何保证序列号未被使用
这是我如何找到要分配的序列号 1)检查数据库中最高使用的序列号 2)分配它并刷新实体。
我使用此序列作为此实体的多个版本的标识符,因此它不是DB的唯一标识符。
如何保证指定的号码是真正独特的?我会锁定在平坦的PHP表,但不知道如何或如果它是symfony2中的最佳做法。
/**
* Establishes a analysi entity.
*
*/
public function establishAction(Request $request, Analysis $analysi)
{
...
$analysi->setSerial($this->getNewSerial());//set a new serial number
//TODO: How to confirm this is really not in use since there is no transaction locking going on here?
$em->flush($analysi);
...
}
private function getNewSerial()
{
$em = $this->getDoctrine()->getManager();
//get highest serial nb from established analysises
$results = $em->createQuery("SELECT MAX(a.serial) FROM HazardlogBundle:Analysis a WHERE a.currentVersion = true")->getResult();
$temp = $results[0];
$max_serial = $temp[1];
$new_serial = $max_serial + 1;
return $new_serial;
}
---------------- UPDATE
我显然必须clearify: 我可以有...
entity A with serial 123 and version 1
entity B with serial 123 and version 2
entity C with serial 124 and version 1
entity D with serial 125 and version 1
我是什么害怕的是用户同时创建实体C和D,因此我的控制器可以获取用于创建实体C的当前最高序列号,并且在实体C被刷新到DB之前,为用户创建实体D服务的线程将读取最高编号为123的实体C在串行124之前写入数据库。因此,我将最终与实体C & D都有序列124.
也许我可以定义一个唯一的索引,包括串行和版本号一起回避这个问题?
看看学说锁表支持: HTTP://文档。 doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency。html#locking-support – erwan