Race Condition bei Subquery

Hallo,

kann es bei einem Subquery wie diesem hier durch eine Race Condition zu
doppelten Werten in der id-Spalte kommen? Falls ja, wie kann man das am
besten (ohne auto_increment) vermeiden?

INSERT INTO collection (`id`, `name`, `element`) VALUES ((SELECT MAX(c2.
`id`) + 1 FROM collection c2), 'stack_foo', 'myelementvalue');

Gruß
David
David Fuhr [ Do, 10 April 2008 15:18 ] [ ID #1939470 ]

Re: Race Condition bei Subquery

David Fuhr wrote:

> kann es bei einem Subquery wie diesem hier durch eine Race Condition zu
> doppelten Werten in der id-Spalte kommen? Falls ja, wie kann man das am
> besten (ohne auto_increment) vermeiden?
>
> INSERT INTO collection (`id`, `name`, `element`) VALUES ((SELECT MAX(c2.
> `id`) + 1 FROM collection c2), 'stack_foo', 'myelementvalue');
>

Eine 'Race Condition' kann ich mir bei einem RDBMS kaum vorstellen, die
Statements werden streng sequentiell abgearbeitet werden. Experten mögen
mich korrigieren und Gegenbeispiele liefern...
Im konkreten Fall wird das innere SELECT komplettiert, bevor das INSERT
gestartet wird. Aus dem SELECT wird eine temporäre Tabelle generiert, aus
der dann die INSERT-Statements entstehen.

--
arkascha
arkascha [ Do, 10 April 2008 19:04 ] [ ID #1939475 ]

Re: Race Condition bei Subquery

David Fuhr <david.fuhr [at] web.de> wrote:
>
> kann es bei einem Subquery wie diesem hier durch eine Race Condition zu
> doppelten Werten in der id-Spalte kommen? Falls ja, wie kann man das am
> besten (ohne auto_increment) vermeiden?
>
> INSERT INTO collection (`id`, `name`, `element`) VALUES ((SELECT MAX(c2.
> `id`) + 1 FROM collection c2), 'stack_foo', 'myelementvalue');

Probier das doch einfach mal aus, dann wirst du sehen, daß sich
*diese* Frage gar nicht stellt.

BTW gibts AUTO_INCREMENT genau dafür. Aber wenn du nicht willst...


XL
Axel Schwenke [ Do, 10 April 2008 23:57 ] [ ID #1939477 ]

Re: Race Condition bei Subquery

> kann es bei einem Subquery wie diesem hier durch eine Race Condition zu
> doppelten Werten in der id-Spalte kommen? Falls ja, wie kann man das am
> besten (ohne auto_increment) vermeiden?
>
> INSERT INTO collection (`id`, `name`, `element`) VALUES ((SELECT MAX(c2.
> `id`) + 1 FROM collection c2), 'stack_foo', 'myelementvalue');

LOCK TABLES
Frank Arthur [ Fr, 11 April 2008 12:33 ] [ ID #1940266 ]
Datenbanken » de.comp.datenbanken.mysql » Race Condition bei Subquery

Vorheriges Thema: Löschen von Tabelleneinträgen mit fehlender Reffer
Nächstes Thema: Wie kann ich den Comment eines Feldes ermitteln?