Race Condition bei Subquery

Race Condition bei Subquery

am 10.04.2008 15:18:09 von David Fuhr

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

Re: Race Condition bei Subquery

am 10.04.2008 19:04:53 von arkascha

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

Re: Race Condition bei Subquery

am 10.04.2008 23:57:51 von Axel Schwenke

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');

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

Re: Race Condition bei Subquery

am 11.04.2008 12:33:46 von Frank Arthur

> 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