Ich habe ein Dokumenten-Management-System in symfony2. Sobald der Benutzer seine Dokumenteneinheit eingerichtet hat, wird ihm eine Seriennummer zugewiesen.symfony2 wie garantie Seriennummer nicht verwendet
So finde ich die zu belegende Seriennummer 1) Check DB für die höchste verwendete serielle Schnittstelle 2) Ordnen Sie sie zu und spülen Sie die Einheit.
Ich verwende diese Seriennummer als eine Kennung für mehrere Versionen dieser Entität, so dass es nicht eindeutig für die DB ist.
Wie kann ich garantieren, dass die zugewiesene Nummer wirklich einzigartig ist? Ich würde Tabellen in Flat-PHP sperren, aber nicht sicher, wie es geht oder ob es in Symfony2 am besten funktioniert.
/**
* 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
Ich muss offensichtlich clearify: ich haben kann ...
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
Was ich bin Angst davor ist, dass Benutzer gleichzeitig Entität C und D erstellen, und so mein Controller die aktuell höchste Seriennummer abrufen konnte, die zum Erstellen von Entität C verwendet wird, und bevor Entität C in DB gelöscht wird, liest der Thread, der den Benutzer D liefert, am höchsten Nummer 123 aus der DB vor Entity C mit Seriennummer 124 wird in DB geschrieben. So werde ich mit Entity C & D beide mit der seriellen 124 enden.
Vielleicht könnte ich einen eindeutigen Index bestehend aus Serien-und Versionsnummer zusammen definieren, um dieses Problem zu umgehen?
hat einen Blick auf Lehre Sperrtabelle Unterstützung: http: // docs. document-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html # locking-support – erwan