Nos amit csinálok, tulajdonképpen szerintem teljesen OK:
Csinálok egy INSERT-et a táblába, majd rögtön lekérdezem az így létrejött azonosítót. Erre a számra szükségem van, mert ez egy HTML-oldal paraméterezéséhez kell majd.
Az INSERT után azonnal SELECT-et csinálok, közben nem zárom le a tranzakciót. Mindezt Delphi-ből ADO-n keresztül.
Tudom, hogy Rollback esetén nem görgetődik vissza az IDENTITY, de ez most részemről lényegtelen... Számomra csak a felvett rekord ID-je érdekes, a fontos az, hogy két egyszerre érkező INSERT esetén is megfelelő ID-t adjak vissza a két kérésnek.
Azért az "előre " legenerált egyedi azonosítokkal vigyázz, mert az mindig "veszélyes" :)
SQL ervernél figyelj a scope-ra és a tranzakciókra, ha az egyedi azonosítókat akarod előre "megtippelni".
Látom, ismered valamennyire az MSSQL-t. Lenne egy kérdésem:
- Hogyan tudok egyedi ID-t generálni MSSQL alatt és a generált értéket kiolvasni?
A probléma ugye ismerős:
Adott pl. egy "számlafej" és a "tételek" tábla, ahol a tételek táblában van hivatkozás a számlafej ID-re. Namármost elöbb ugye ilyenkor felvesszük a fejlécet és a generált ID-t eltároljuk a tételekben.
Ezt én InterBase alatt így oldottam meg:
CREATE GENERATOR GEN_SZAMLAFEJ;
CREATE PROCEDURE GET_NEXT_SZAMLA_ID RETURNS (ID INTEGER)
AS
BEGIN
ID = GEN_ID(GEN_SZAMLAFEJ, 1);
END !!
Majd meghívva a tárolt eljárást megkaptam a generált egyedi azonosítót, melyet mind a számlafej insert-nél, mint pedig a tételeknél biztonságban használhattam.
Persze, ha nem kellett kiolvasni az ID-t, csak simán generálni egyet, akkor azt triggerből csináltam.
Nos a problémám az, hogy A Books Online-t olvasgatva sem Generátort nem találok, sem pedig GEN_ID-t...
Szóval, hogy csinálják az egyedi ID-t MSSQL alatt???
Ui: Ismerem a SELECT MAX(ID)... módszert, de a sebessége valamint a konkurrens hozzáférés miatt nem tartom jó ötletnek...
Az MSDE nem letölthető, viszont külön pénzbe sem kerül. Minden Office XP Professional (vagy jobb) tartalmazza -- az Access tartozéka, tehát minden Access-t is tartalmazó Office-ban benne van, használhatja az Office csomag tulajdonosa.
Van néhány olyan fejlesztői termék, aminek birtoklása az MSDE továbbterjesztésére is jogosít (redistribution). Ezek (valószínűleg a teljesség igénye nélkül): Visual Studio (6 és .NET is, de meg kell nézni, hogy az MSDE melyik változatát szabad terjeszteni velük), az Office Developer (szintén a 2000 és az XP is, de más-más MSDE-változatot terjeszthetsz), illetve az SQL Server 2000 Developer változat, valamint az MSDN Universal.
Ha ezek közül valamelyik megvan, akkor a redist.txt-t kell elolvasni, abban van az MSDE pontos terjesztési feltétel-rendszere.
Az MSDE két változata:
1. MSDE 1.0, avagy Microsoft Data Engine: ez az SQL Server 7.0 MSDE-változata.
2. MSDE 2.0, avagy Microsoft Desktop Engine: ez az SQL Server 2000 MSDE-változata.
Igen, már én is átrágtam magam a leírásokon, és szép lassan elhatározásra jutok ezügyben :)
Amúgy ha jól értelmeztem, akkor csak abban az esetben free az MSDE, ha van bizonyos termékre liszenszed. pl. ilyen lehet a Visual Studio vagy az Office XP Developer.
Szerintem is MSDE. Ha az a bizonyos 5 connection-os limitről szóló megjegyzésed erre vonatkozott, akkor eloszlatnám a homályt: MSDE-hez annyian csatlakozhatnak egyszerre, ahányan csak tudnak, ez önmagában nem lassítja. Egyszerre 5-nél több konkurrens műveletnél kezd lassulni (és meg ez is csak pongyola fogalmazás, az 5-ös limit egyfajta belső sorbanállásra vonatkozik, de közelíti a valóságot).
A postgres lassú lesz, mivel nem multithread hanem multiprocess, de skálázható. Tud mindent (na jó: szinte mindent), pl saját PLsql-je van amire nagyon könnyen lehet oraclet postolni + van egy pgaccess nevű queryanalyzer + pl/pgsql fejlesztői eszköz is hozzá.
Viszont a multiprocess cuccok windowson lassúak. Gőzöm sincs, hogy nálad mennyire lesz lassú, 1 próbát szerintem megér.
Van egy problémám, mely eléggé bosszantó... Erre keresek megoldást.
Szóval kellene egy jó SQL szerver Windows alá, de annyira nem egyszerű a megoldás.
Eddig FireBird-et használtam (ez ugyebár open Interbase klón). Nagyon jó, csak van vele egy hatalmas problémám: a "kliens oldali" gds32.dll nem thread-safe! Mivel ez egy web-es project, ISAPI DLL-ből piszkálgatom a szervert és rendszeresen hibák jönnek elő (pl: Invalid transaction handle...) A hibajelenséget egyéb ötletek hiányában én ennek a non thread-safe dolognak tulajdonítom...
A kérdés tehát adott: Ki tud olyan SQL szervert ajánlani Windows alá, mely megfelel az alábbi követelményeknek:
- nem csak 1-5 connectet tud egyszerre lekezelni, hanem minimum 10-20-at, de legjobb egy korlátlan lenne
- thread-safe ! (Firebird itt esett ki)
- van benne: tranzakció, trigger, view és tárolt eljárás! (MySQL kiesett)
- ingyenes, vagy nem milliós nagyságrendű :) - MSSQL pedig itt :(
Ha esetleg valaki találkozott már az "Invalid transaction handle" hibaüzenettel szintén örömmel venném a tapasztalait!