Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megfelelőség
Bemutatott verzió: ODBC 3.0 szabványoknak megfelelés: ISO 92
Summary
Az SQLEndTran minden aktív művelethez egy commitációt vagy vissza kell hozni egy kapcsolathoz kapcsolódó összes utasításra.
Az SQLEndTran azt is kérheti, hogy végezzenek commit vagy rollback műveletet minden környezethez kapcsolódó kapcsolatra.
Note
További információért arról, hogy a Driver Manager mire térképezi ezt a függvényt, amikor egy ODBC 3. x alkalmazás ODBC 2-vel működik. x illesztőprogram, lásd : Alkalmazások visszafelé kompatibilitásának leképezési helyettesítő függvényei.
Syntax
SQLRETURN SQLEndTran(
SQLSMALLINT HandleType,
SQLHANDLE Handle,
SQLSMALLINT CompletionType);
Arguments
HandleType
[Bemenet] Kezelő típusazonosító. Tartalmaz vagy SQL_HANDLE_ENV-t (ha a Handle környezeti fogantyú), vagy SQL_HANDLE_DBC-et (ha a Handle egy kapcsolati fogyatula).
Kezelőfelület
[Bemenet] A HandleType által jelölt típusú fogantyú, amely a tranzakció hatókörét jelzi. További információért lásd a "Hozzászólásokat".
CompletionType
[Bemenet] Az alábbi két érték egyike:
SQL_COMMIT SQL_ROLLBACK
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE vagy SQL_STILL_EXECUTING.
Diagnostics
Amikor az SQLEndTran SQL_ERROR vagy SQL_SUCCESS_WITH_INFO értéket ad, egy hozzárendelt SQLSTATE értéket lehet megszerezni az SQLGetDiagRec hívásával a megfelelő HandleType és Handle segítségével. Az alábbi táblázat felsorolja az SQLEndTran által gyakran visszaadott SQLSTATE értékeket, és mindegyiket elmagyarázza ezen függvény kontextusában; a "(DM)" jelölés megelőzi a Driver Manager által visszaadott SQLSTATE-leírásokat. Az egyes SQLSTATE-értékekhez társított visszatérési kód SQL_ERROR, kivéve, ha másként van feltüntetve.
| SQLSTATE | Hiba | Description |
|---|---|---|
| 01000 | Általános figyelmeztetés | Illesztőprogram-specifikus tájékoztató üzenet. (A függvény SQL_SUCCESS_WITH_INFO ad vissza.) |
| 08003 | A kapcsolat nincs megnyitva | (DM) A HandleType SQL_HANDLE_DBC volt, és a Handle nem volt összekapcsolt állapotban. |
| 08007 | Kapcsolati hiba tranzakció közben | A HandleType SQL_HANDLE_DBC, és a Handle-hez kapcsolódó kapcsolat a funkció végrehajtása során meghibásodott, így nem lehet megállapítani, hogy a kért COMMIT vagy ROLLBACK a hiba előtt történt-e. |
| 25S01 | Tranzakciós állapot ismeretlen | A Handle-ben egy vagy több kapcsolat nem tudta befejezni a tranzakciót a megadott eredménnyel, és az eredmény ismeretlen. |
| 25S02 | A tranzakció továbbra is aktív | A meghajtó nem tudta garantálni, hogy a globális tranzakcióban minden munka atomálisan elvégezhető, és a tranzakció továbbra is aktív. |
| 25S03 | A tranzakció visszafordítva van | A meghajtó nem tudta garantálni, hogy a globális tranzakcióban minden munka atomálisan elvégezhető, és a Handle-ben aktív tranzakcióban lévő összes munka visszafordítódott. |
| 40001 | Szerializálási hiba | A tranzakció egy erőforrás holtpontja miatt lett visszaállítva egy másik tranzakcióval. |
| 40002 | Integritási kényszer megsértése | A CompletionType SQL_COMMIT volt, és a változtatások elkötelezettsége integritási korlátozások megsértéséhez vezetett. Ennek eredményeként a tranzakciót visszavonták. |
| HY000 | Általános hiba | Hiba történt, amely miatt nem volt konkrét SQLSTATE, és amelyhez nem definiáltak implementációspecifikus SQLSTATE-t. Az SQLGetDiagRec által a *szMessageText pufferben visszaadott hibaüzenet leírja a hibát és annak okát. |
| HY001 | Memóriafoglalási hiba | Az illesztőprogram nem tudta lefoglalni a függvény végrehajtásának vagy befejezésének támogatásához szükséges memóriát. |
| HY008 | A műveletet megszakították | Az aszinkron feldolgozás engedélyezett volt a ConnectionHandle számára. A függvényt hívták meg, és mielőtt befejezte volna a végrehajtást, az SQLCancelHandle függvényt hívták meg a ConnectionHandle-en. Ezután a függvényt ismét meghívták a ConnectionHandle-en. A függvényt hívták meg, és mielőtt befejezte volna a futtatást, az SQLCancelHandle-t egy másik szálból hívták meg a ConnectionHandle-en egy többszálas alkalmazásban. |
| HY010 | Függvényütemezési hiba | (DM) Egy aszinkron módon futó függvényt hívtak egy ConnectionHandle hozzátartozó utasításkezelőhöz, amely még futott, amikor az SQLEndTran meghívása volt. (DM) Egy aszinkron futó függvényt (nem ezt) hívtak a ConnectionHandle miatt, és még akkor futott, amikor ezt a függvényt hívták. (DM) Az SQLExecute, SQLExecDirect, SQLBulkOperations vagy SQLSetPos egy ConnectionHandle hozzátartozó utasításkezelőhöz hívták, és SQL_NEED_DATA visszaadták. Ezt a függvényt az összes adatvégrehajtási paraméter vagy oszlop adatküldése előtt hívták meg. (DM) Egy aszinkron futó függvényt (nem ezt) hívtak a Handle SQL_HANDLE_DBC-ra állított HandleType esetén, és még mindig futott, amikor ezt a függvényt hívták. (DM) Az SQLExecute, SQLExecDirect vagy SQLMoreResults az egyik Handle-hez tartozó utasításkezelőhöz hívták, és SQL_PARAM_DATA_AVAILABLE adták vissza. Ez a függvény az összes streamelt paraméter adatainak lekérése előtt lett meghívva. |
| HY012 | Érvénytelen tranzakciós műveleti kód | (DM) A CompletionType argument értéke sem SQL_COMMIT, sem SQL_ROLLBACK volt. |
| HY013 | Memóriakezelési hiba | A függvényhívás nem dolgozható fel, mert a mögöttes memóriaobjektumok nem érhetők el, esetleg a memóriahiány miatt. |
| HY092 | Érvénytelen attribútum/opcióazonosító | (DM) A HandleType argument értéke sem SQL_HANDLE_ENV, sem SQL_HANDLE_DBC nem volt. |
| HY115 | Az SQLEndTran nem engedélyezett olyan környezetben, amely aszinkron függvényvégrehajtással rendelkező kapcsolatot tartalmaz | (DM) HandleType nem állítható be SQL_HANDLE_ENV-re, ha a kapcsolati funkciók aszinkron végrehajtása engedélyezett a környezetben lévő kapcsolat esetén. |
| HY117 | A kapcsolat ismeretlen tranzakciós állapot miatt fel van függesztve. Csak a leválasztási és írásvédett függvények engedélyezettek. | (DM) További információért a felfüggesztett állapotról lásd a témában a Hozzászólások szekcióját. |
| HYC00 | A választható funkció nem implementálva | Az illesztőprogram vagy adatforrás nem támogatja a ROLLBACK műveletet. |
| HYT01 | A kapcsolati időkorlát lejárt | A kapcsolat időtúllépési időtartama lejárt, mielőtt az adatforrás válaszolt a kérésre. A kapcsolat időtúllépési időszaka az SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT keresztül van beállítva. |
| IM001 | Az illesztőprogram nem támogatja ezt a függvényt | (DM) A ConnectionHandle csatlakoztatott illesztőprogram nem támogatja ezt a funkciót. |
| IM017 | A lekérdezés aszinkron értesítési módban le van tiltva | Az értesítési modell használata esetén a lekérdezés le van tiltva. |
| IM018 | Az SQLCompleteAsync nem lett meghívva az előző aszinkron művelet végrehajtásához ezen a leírón. | Ha a leíró előző függvényhívása SQL_STILL_EXECUTING ad vissza, és ha az értesítési mód engedélyezve van, az SQLCompleteAsync-et a leírón kell meghívni a művelet utófeldolgozásához és befejezéséhez. |
Comments
ODBC 3-ra. x driver, ha a HandleType SQL_HANDLE_ENV és a Handle egy érvényes környezeti handle, akkor a Driver Manager minden környezethez kapcsolódó driverben SQLEndTran-t hív. A meghajtóhoz hívás Handle argumentja a driver környezeti handle-e lesz. Egy ODBC 2-hez. x driver, ha a HandleType SQL_HANDLE_ENV és a Handle egy érvényes környezeti handle, és abban a környezetben több kapcsolat is van egy összekapcsolt állapotban, akkor a Driver Manager egyszer hívja a SQLTransact az illesztőprogramban minden csatlakoztatott állapotban lévő kapcsolat esetén az adott környezetben. Minden hívásban a Handle argumentum lesz a kapcsolat handle-e. Mindkét esetben az illesztőprogram megpróbálja a tranzakciókat a CompletionType értékétől függően visszavonni vagy kötelezni minden olyan kapcsolatot, amely az adott környezetben összekapcsolt állapotban van. Az aktív kapcsolatok nem befolyásolják a tranzakciót.
Note
Az SQLEndTran nem használható tranzakciók kötelezésére vagy visszafordítására megosztott környezeten. Az SQLSTATE HY092 (Invalid attribútum/opcióazonosító) akkor jelenik meg, ha az SQLEndTran meghívása a Handle vagy egy megosztott környezet vagy egy kapcsolat kezelő nevű kezelésére van beállítva.
A Driver Manager csak akkor tér vissza SQL_SUCCESS, ha minden kapcsolathoz SQL_SUCCESS kap. Ha a Driver Manager egy vagy több kapcsolaton SQL_ERROR kap, visszaadja SQL_ERROR az alkalmazásnak, és a diagnosztikai információkat a környezet diagnosztikai adatszerkezetébe helyezik. Annak meghatározására, hogy melyik kapcsolat vagy kapcsolatok hibáskodtak a commit vagy rollback művelet során, az alkalmazás minden kapcsolathoz SQLGetDiagRec-et hívhat.
Note
A Driver Manager nem szimulál globális tranzakciót minden kapcsolaton, ezért nem használ kétfázisú commit protokollokat.
Ha a CompletionType SQL_COMMIT, az SQLEndTran commitációs kérést küld ki minden aktív műveletre bármely érintett kapcsolathoz tartozó utasításon. Ha a CompletionType SQL_ROLLBACK, az SQLEndTran vissza kell kérnie minden aktív műveletre bármely érintett kapcsolathoz tartozó utasításon. Ha nincs aktív tranzakció, az SQLEndTran SQL_SUCCESS vissza ad anélkül, hogy hatással nincs az adatforrásokra. További információért lásd: Tranzakciók elköteleződése és visszafordítása.
Ha az illesztőprogram kézi commit módban van (az SQLSetConnectAttr hívásával, SQL_ATTR_AUTOCOMMIT attribútumot SQL_AUTOCOMMIT_OFF-re állítva), akkor implicit módon új tranzakció indul, amikor egy SQL utasítást, amely egy tranzakcióban található, a jelenlegi adatforrás ellen hajtanak végre. További információért lásd: Commit mód.
Annak meghatározására, hogy a tranzakciós műveletek hogyan hatnak a kurzorokra, egy alkalmazás az SQLGetInfo-t hívja a SQL_CURSOR_ROLLBACK_BEHAVIOR és SQL_CURSOR_COMMIT_BEHAVIOR opciókkal. További információért lásd a következő bekezdéseket, valamint a tranzakciók hatása a kurzorokra és az előkészített kimutatásokra.
Ha az SQL_CURSOR_ROLLBACK_BEHAVIOR vagy SQL_CURSOR_COMMIT_BEHAVIOR érték SQL_CB_DELETE-et, az SQLEndTran lezárja és törli az összes nyitott kurzort minden a kapcsolathoz kapcsolódó utasításon, és eldobja az összes függő eredményt. Az SQLEndTran bármely jelenlévő utasítást kijelölt (felkészítetlen) állapotban hagy; az alkalmazás újrahasznosíthatja ezeket a későbbi SQL kérésekhez, vagy hívhatja SQLFreeStmt-t vagy SQLFreeHandle-t egy SQL_HANDLE_STMT HandleType-vel , hogy elengedje őket.
Ha az SQL_CURSOR_ROLLBACK_BEHAVIOR vagy SQL_CURSOR_COMMIT_BEHAVIOR érték SQL_CB_CLOSE-et, az SQLEndTran lezárja az összes nyitott kurzort az adott kapcsolathoz tartozó összes állításon. Az SQLEndTran minden jelenlévő utasítást előkészített állapotban hagy; az alkalmazás hívhatja az SQLExecute-ot egy kapcsolódáshoz tartozó utasításért anélkül, hogy előbb SQLPrepare hívná.
Ha az SQL_CURSOR_ROLLBACK_BEHAVIOR vagy SQL_CURSOR_COMMIT_BEHAVIOR érték SQL_CB_PRESERVE-, az SQLEndTran nem érinti a kapcsolathoz tartozó nyílt kurzorokat. A kurzorok azon a soron maradnak, amire az SQLEndTran hívás előtt mutattak.
Olyan illezőprogramok és adatforrások esetén, amelyek tranzakciókat támogatnak, ha SQLEndTran hívása SQL_COMMIT vagy SQL_ROLLBACK volt, amikor nincs aktív tranzakció, SQL_SUCCESS ad vissza (ami azt jelzi, hogy nincs munkát kötelezni vagy visszafordítani), és nincs hatása az adatforrásra.
Amikor egy illesztőprogram automatikus commit módban van, a Driver Manager nem hívja az SQLEndTran-t az illesztőprogramban. Az SQLEndTran mindig SQL_SUCCESS visszaadja a SQL_COMMIT vagy SQL_ROLLBACK CompletionType hívását.
Azok a meghajtók vagy adatforrások, amelyek nem támogatják a tranzakciókat (SQLGetInfoopció SQL_TXN_CAPABLE SQL_TC_NONE), gyakorlatilag mindig automatikus kötelező módban vannak, ezért mindig visszatérnek SQL_SUCCESS SQLEndTran-hoz , függetlenül attól, hogy CompletionType SQL_COMMIT vagy SQL_ROLLBACK hívják. Az ilyen meghajtók és adatforrások valójában nem fordítanak vissza a tranzakciókat, ha kérik őket.
Felfüggesztett állam
A Windows 7 előtt megjelent Driver Managerekben tranzakció aktív volt, ha az SQLEndTran SQL_ERROR az illesztőprogramból tért vissza. Azonban lehetséges volt, hogy a tranzakciót sikeresen végrehajtották a szerveren, de az ügyfél illesztőprogramját nem értesítették (például hálózati hiba miatt). Ez rossz állapotba hozná a kapcsolatot. A Windows 7-től kezdve, amikor az SQLEndTran SQL_ERROR visszaad, a kapcsolat felfüggesztett állapotban lehet. Felfüggesztett állapotban lehetséges csak olvasható függvényeket hívni. Végül az alkalmazásnak fel kell hívnia az SQLDisconnectet egy felfüggesztett kapcsolaton az erőforrások felszabadításához.
Ha az alábbi feltételek mind érvényesek, a kapcsolat felfüggesztett állapotba kerül:
Az illeszőr visszaadja SQL_ERROR az SQLEndTran-tól.
A meghajtó az ODBC 3.8-as verziója, vagy újabb.
Az alkalmazás verziója 3.8 vagy újabb verzió; vagy az újrafordított ODBC 2.x vagy 3.x alkalmazás sikeresen megszünteti az SQLEndTran funkciót az SQLCancelHandle-en keresztül.
Az illesztőprogram nem adott vissza az alábbi üzenetek egyikét, amelyek megerősítik, hogy a tranzakció nem fejeződött be:
25S03: A tranzakció visszavonulása
40001: Sorozatosítási hiba
40002: Integritási korlátozás
HYC00: Opcionális funkció nem valósított meg
Ha az SQLEndTran-t egy környezeti handle segítségével hívták meg, és valamelyik kapcsolata megfelel a fenti feltételeknek, akkor minden ugyanahhoz az illesztőprogramhoz csatlakozó kapcsolat felfüggesztett állapotba kerül.
Miután egy alkalmazás felfüggesztett kapcsolaton SQLDisconnectet hív, a kapcsolat segítségével újra csatlakozhat egy másik adatforráshoz vagy ugyanahhoz az adatforráshoz.
Kapcsolódó funkciók
| Információ erről: | Nézze |
|---|---|
| Egy aszinkron futó függvény törlése egy kapcsolati fogantyún. | SQLCancelHandle függvény |
| Információ visszaküldése egy driverről vagy adatforrásról | SQLGetInfo Function |
| Egy fogantyú felszabadítása | SQLFreeHandle függvény |
| Egy utasításkezelő felszabadítása | SQLFreeStmt függvény |