SQLEndTran İşlevi

Uygunluk
Tanıtılan Sürüm: ODBC 3.0 Standartlarına Uyum: ISO 92

Summary
SQLEndTran , bağlantıya bağlı tüm ifadeler üzerinde tüm aktif işlemler için commit veya rollback işlemi talep eder. SQLEndTran ayrıca bir ortamla ilişkili tüm bağlantılar için bir commit veya geri alma işlemi yapılmasını talep edebilir.

Note

Driver Manager bu fonksiyonu ODBC 3 olduğunda neye eşlediği hakkında daha fazla bilgi için. x uygulaması ODBC 2 ile çalışıyor. x sürücüsü, bkz. Uygulamaların Geriye Doğru Uyumluluğu için Eşleme Değiştirme Fonksiyonları.

Syntax

  
SQLRETURN SQLEndTran(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle,  
     SQLSMALLINT   CompletionType);  

Arguments

HandleType
[Giriş] Tip tanımlayıcısını tutun. Ya SQL_HANDLE_ENV ( eğer Handle bir ortam tutamıysa) ya da SQL_HANDLE_DBC ( eğer Handle bir bağlantı tutucuysa) içerir.

Kulp
[Giriş] HandleType tarafından belirtilen tipte olan tutamak, işlemin kapsamını gösterir. Daha fazla bilgi için "Yorumlar"a bakınız.

Tamamlama Türü
[Giriş] Aşağıdaki iki değerden biri:

SQL_COMMIT SQL_ROLLBACK

İadeler

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE ya da SQL_STILL_EXECUTING.

Diagnostics

SQLEndTran SQL_ERROR veya SQL_SUCCESS_WITH_INFO döndürdüğünde, ilgili bir SQLSTATE değeri uygun HandleType ve Handle ile SQLGetDiagRec çağrılarak elde edilebilir. Aşağıdaki tablo, SQLEndTran tarafından sıkça döndürülen SQLSTATE değerlerini listeler ve her birini bu fonksiyonun bağlamında açıklar; "(DM)" gösterimi, Sürücü Yöneticisi tarafından döndürülen SQLSTATE açıklamalarından önce gelir. Aksi belirtilmediği sürece, her SQLSTATE değeriyle ilişkili dönüş kodu SQL_ERROR.

SQLSTATE Error Description
01000 Genel uyarı Sürücüye özgü bilgilendirici ileti. (İşlev SQL_SUCCESS_WITH_INFO döndürür.)
08003 Bağlantı açık değil (DM) HandleType SQL_HANDLE_DBC ve Handle bağlı durumda değildi.
08007 İşlem sırasında bağlantı arızası HandleType SQL_HANDLE_DBC ve Handle ile ilişkili bağlantı işlevin yürütülmesi sırasında başarısız oldu; istenen COMMIT veya ROLLBACK'in hatadan önce gerçekleşip gerçekleşmediği belirlenemez.
25S01 İşlem durumu bilinmiyor Handle'daki bağlantılardan biri veya birkaçı işlemi belirtilen sonuçla tamamlayamadı ve sonuç bilinmiyor.
25S02 İşlem hâlâ aktif Sürücü, küresel işlemdeki tüm işlerin atomik olarak tamamlanabileceğini garanti edemedi ve işlem hâlâ aktif.
25S03 İşlem geri alınır Sürücü, küresel işlemdeki tüm işin atomik olarak tamamlanabileceğini garanti edemedi ve Handle'da aktif olan işlemdeki tüm işler geri alındı.
40001 Serileştirme hatası Başka bir işlemle kaynak kilitlenmesi nedeniyle işlem geri alındı.
40002 Bütünlük kısıtlaması ihlali CompletionType SQL_COMMIT ve değişikliklerin taahhüdü bütünlük kısıtlaması ihlaline yol açtı. Sonuç olarak, işlem geri alındı.
HY000 Genel hata Belirli bir SQLSTATE olmayan ve uygulamaya özgü SQLSTATE tanımlanmayan bir hata oluştu. *szMessageText tamponunda SQLGetDiagRec tarafından gönderilen hata mesajı, hatayı ve nedenini tanımlar.
HY001 Bellek ayırma hatası Sürücü, işlevin yürütülmesini veya tamamlanmasını desteklemek için gereken belleği ayıramadı.
HY008 İşlem iptal edildi ConnectionHandle için asenkron işlem etkinleştirildi. Fonksiyon çağrıldı ve çalıştırılması bitmeden önce ConnectionHandle üzerinde SQLCancelHandle Fonksiyonu çağrıldı. Sonra fonksiyon ConnectionHandle üzerinde tekrar çağrıldı.

Fonksiyon çağrıldı ve çalıştırılması bitmeden önce çok iş parçacıklı bir uygulamada farklı bir iş parçacığından ConnectionHandle üzerinde çağrıldı.
HY010 İşlev dizisi hatası (DM) ConnectionHandle ile ilişkili bir özet tutamacı için asenkron olarak çalışan bir fonksiyon çağrıldı ve SQLEndTran çağrıldığında hâlâ çalışıyordu.

(DM) ConnectionHandle için asenkron olarak çalışan bir fonksiyon (bu değil) çağrıldı ve bu fonksiyon çağrıldığında hâlâ çalışıyordu.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations veya SQLSetPos , ConnectionHandle ile ilişkili bir ifade tutamacı için çağrıldı ve SQL_NEED_DATA dönerdi. Bu işlev, tüm yürütme sırasında veri parametreleri veya sütunları için veri gönderilmeden önce çağrıldı.

(DM) HandleType SQL_HANDLE_DBC olarak ayarlanmış Handle için asenkron olarak çalışan bir fonksiyon çağrıldı ve bu fonksiyon çağrıldığında hâlâ çalışıyordu.

(DM) SQLExecute, SQLExecDirect veya SQLMoreResultsHandle ile ilişkili özet tutamaçlarından biri için çağrıldı ve SQL_PARAM_DATA_AVAILABLE döndürüldü. Bu işlev, tüm akış parametreleri için veri alınmadan önce çağrıldı.
HY012 Geçersiz işlem işlem kodu (DM) CompletionType argümanı için belirtilen değer ne SQL_COMMIT ne de SQL_ROLLBACK idi.
HY013 Bellek yönetimi hatası Büyük olasılıkla düşük bellek koşulları nedeniyle, temel alınan bellek nesnelerine erişilemediğinden işlev çağrısı işlenemedi.
HY092 Geçersiz öznitelik/seçenek tanımlayıcısı (DM) HandleType argümanı için belirtilen değer ne SQL_HANDLE_ENV ne de SQL_HANDLE_DBC idi.
HY115 SQLEndTran, asenkron fonksiyon çalıştırma etkinleştirilmiş bağlantı içeren bir ortam için izin verilmez (DM) HandleType SQL_HANDLE_ENV olarak ayarlanamaz, eğer bir bağlantı için bağlantı fonksiyonlarının asenkron yürütülmesi etkinleştirilmişse.
HY117 Bilinmeyen işlem durumu nedeniyle bağlantı askıya alındı. Yalnızca bağlantıyı kesme ve salt okunur işlevlere izin verilir. (DM) Askıya alınmış durum hakkında daha fazla bilgi için bu konunun Yorumlar bölümüne bakınız.
HYC00 İsteğe bağlı özellik uygulanmadı Sürücü veya veri kaynağı ROLLBACK işlemini desteklemez.
HYT01 Bağlantı zaman aşımı süresi doldu Veri kaynağı isteği yanıtlamadan önce bağlantı zaman aşımı süresi doldu. Bağlantı zaman aşımı süresi SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT aracılığıyla ayarlanır.
IM001 Sürücü bu işlevi desteklemiyor (DM) ConnectionHandle ile ilişkili sürücü bu fonksiyonu desteklemez.
IM017 Yoklama zaman uyumsuz bildirim modunda devre dışı bırakıldı Bildirim modeli her kullanıldığında yoklama devre dışı bırakılır.
IM018 SQLCompleteAsync , bu tanıtıcıda önceki zaman uyumsuz işlemi tamamlamak için çağrılmadı. Tanıtıcıdaki önceki işlev çağrısı SQL_STILL_EXECUTING döndürüyorsa ve bildirim modu etkinleştirildiyse, son işlemeyi yapmak ve işlemi tamamlamak için tanıtıcıda SQLCompleteAsync çağrılmalıdır.

Comments

ODBC 3 için. x sürücüsü, eğer HandleType SQL_HANDLE_ENV ve Handle geçerli bir ortam handle'ıysa, Driver Manager ortamla ilişkilendirilen her sürücüde SQLEndTran'ı çağırır. Bir sürücüye çağrı için Handle argümanı, sürücünün ortam tutamacı olacaktır. ODBC 2 için. x sürücüsü, eğer HandleType SQL_HANDLE_ENV ve Handle geçerli bir ortam handle ise, ve o ortamda bağlı bir durumda birden fazla bağlantı varsa, Driver Manager o ortamda bağlı durumdaki her bağlantı için sürücüde SQLTransact bir kez çağırır. Her çağrıdaki Handle argümanı bağlantının handle olur. Her iki durumda da, sürücü, CompletionType değerine bağlı olarak o ortamda bağlı durumda olan tüm bağlantılarda işlemleri taahhüt etmeye veya geri almaya çalışır. Aktif olmayan bağlantılar işlemi etkilemez.

Note

SQLEndTran , paylaşılan bir ortamda işlemleri taahhüt etmek veya geri almak için kullanılamaz. SQLSTATE HY092 (Geçersiz öznitelik/seçenek tanımlayıcısı), SQLEndTran çağrılırken Handle paylaşılan bir ortamın tutamacı veya paylaşılan bir ortamdaki bağlantının tutamacı olarak ayarlandığında döner.

Sürücü Yöneticisi SQL_SUCCESS yalnızca her bağlantı için SQL_SUCCESS alırsa geri döner. Sürücü Yöneticisi bir veya daha fazla bağlantıda SQL_ERROR alırsa, SQL_ERROR uygulamaya geri gönderir ve tanı bilgileri ortamın tanı veri yapısına yerleştirilir. Commit veya rollback işlemi sırasında hangi bağlantının veya bağlantıların başarısız olduğunu belirlemek için uygulama her bağlantı için SQLGetDiagRec çağırabilir.

Note

Sürücü Yöneticisi, tüm bağlantılar arasında küresel bir işlem simüle etmez ve bu nedenle iki aşamalı commit protokolü kullanmaz.

Eğer CompletionType SQL_COMMIT ise, SQLEndTran, etkilenen bağlantıyla ilişkili herhangi bir ifade üzerinde tüm aktif işlemler için bir commit talebi gönderir. CompleteType SQL_ROLLBACK ise, SQLEndTran etkilenen bağlantıyla ilişkili herhangi bir ifadede tüm aktif işlemler için geri alma talebi gönderir. Eğer işlem aktif değilse, SQLEndTran SQL_SUCCESS döndürür ve hiçbir veri kaynağına etkisi yoktur. Daha fazla bilgi için bkz. İşlemleri Bağlama ve Geri Geri Götürme.

Sürücü manuel commit modundaysa ( SQLSetConnectAttr çağrılıp, SQL_ATTR_AUTOCOMMIT özniteliği SQL_AUTOCOMMIT_OFF olarak ayarlanmışsa), bir işlem içinde yer alabilen bir SQL ifadesi mevcut veri kaynağına karşı çalıştırıldığında yeni bir işlem örtük olarak başlatılır. Daha fazla bilgi için Commit Modu'na bakınız.

İşlem işlemlerinin imleci nasıl etkilediğini belirlemek için bir uygulama, SQL_CURSOR_ROLLBACK_BEHAVIOR ve SQL_CURSOR_COMMIT_BEHAVIOR seçenekleriyle SQLGetInfo'yu çağırır. Daha fazla bilgi için aşağıdaki paragraflara bakınız ve ayrıca İşlemlerin İmleçler ve Hazırlanmış Açıklamalar üzerindeki Etkisi bölümlerine bakınız.

Eğer SQL_CURSOR_ROLLBACK_BEHAVIOR veya SQL_CURSOR_COMMIT_BEHAVIOR değeri SQL_CB_DELETE eşitse, SQLEndTran bağlantıya bağlı tüm açık imlecimleri kapatır ve siler, bekleyen tüm sonuçları atar. SQLEndTran, mevcut herhangi bir ifadeyi tahsis edilmiş (hazırlıksız) durumda bırakır; uygulama bunları sonraki SQL istekleri için yeniden kullanabilir veya HandleType of SQL_HANDLE_STMT ile SQLFreeStmt veya SQLFreeHandle çağırarak bunları serbest konumlandırabilir.

Eğer SQL_CURSOR_ROLLBACK_BEHAVIOR veya SQL_CURSOR_COMMIT_BEHAVIOR değeri SQL_CB_CLOSE eşitse, SQLEndTran bağlantıya bağlı tüm açık imlecimleri kapatır. SQLEndTran, mevcut herhangi bir ifadeyi hazırlanmış durumda bırakır; uygulama, bağlantıyla ilişkili bir ifade için SQLPrepare çağrısı yapmadan SQLExecute çağırabilir.

Eğer SQL_CURSOR_ROLLBACK_BEHAVIOR veya SQL_CURSOR_COMMIT_BEHAVIOR değeri SQL_CB_PRESERVE eşitse, SQLEndTran bağlantıya bağlı açık imleci etkilemez. İmleçler, SQLEndTran çağrısından önce işaret ettikleri sırada kalıyor.

İşlemleri destekleyen sürücüler ve veri kaynakları için, herhangi bir işlem aktif olmadığında SQLEndTran'ı SQL_COMMIT veya SQL_ROLLBACK ile çağırmak SQL_SUCCESS getirir (bu da bağlanacak veya geri alınacak bir iş olmadığını gösterir) ve veri kaynağı üzerinde hiçbir etkisi yoktur.

Bir sürücü otomatik commit modundayken, Driver Manager sürücüde SQLEndTran çağrısını yapmaz. SQLEndTran , CompletionType olarak çağrılıp çağrılmadığına bakmaksızın her zaman SQL_SUCCESS döndürür, ister SQL_COMMIT ister SQL_ROLLBACK.

İşlemleri desteklemeyen sürücüler veya veri kaynakları (SQLGetInfoseçeneği SQL_TXN_CAPABLE SQL_TC_NONE) her zaman otomatik commit modundadır ve bu nedenle CompletionType SQL_COMMIT ya da SQL_ROLLBACK ile çağrılıp çağrılmasalar da her zaman SQLEndTran için SQL_SUCCESS döner. Bu tür sürücüler ve veri kaynakları, istendiğinde işlemleri geri almıyor.

Askıya Alan Durumu

Windows 7'den önce yayınlanan Sürücü Yöneticilerinde, SQLEndTran sürücüden SQL_ERROR döndürüyorsa işlem aktifti. Ancak, işlemin sunucuda başarıyla gerçekleşmiş olması ancak istemci üzerindeki sürücüye bildirim verilmemiş olması mümkündü (örneğin, ağ hatası meydana geldiği için). Bu bağlantı kötü durumda bırakır. Windows 7'dan başlayarak, SQLEndTran SQL_ERROR döndürdüğünde, bağlantı askıya alınmış durumda olabilir. Askıya alınmış durumda, yalnızca okunan fonksiyonları çağırmak mümkündür. Sonunda, uygulama askıya alınmış bağlantıda SQLDisconnect'i çağırarak kaynakları serbest bırakmalıdır.

Aşağıdaki tüm koşullar geçerliyse, bağlantı askıya alınır:

  • Sürücü SQL_ERROR SQLEndTran'dan döndürür.

  • Sürücü ODBC 3.8 sürümü veya daha sonrasıdır.

  • Uygulama sürümü 3.8 veya daha üzerindedir; veya yeniden derlenen ODBC 2.x veya 3.x uygulaması, SQLCancelHandle üzerinden SQLEndTran fonksiyonunu başarıyla iptal eder.

  • Sürücü, işlemin tamamlanmadığını doğrulayan aşağıdaki mesajlardan birini döndürmedi:

    • 25S03: İşlem geri alındı

    • 40001: Serileştirme hatası

    • 40002: Bütünlük kısıtlaması

    • HYC00: Isteğe bağlı özellik uygulanmadı

Eğer SQLEndTran bir ortam kolunda çağrıldı ve bağlantılarından biri yukarıdaki koşulları karşıladıysa, aynı sürücüye bağlanan tüm bağlantılar askıya alındı.

Bir uygulama askıya alınmış bir bağlantıda SQLDisconnect çağrısı yaptıktan sonra, bağlantı başka bir veri kaynağına veya aynı veri kaynağına yeniden bağlanmak için kullanılabilir.

Hakkında bilgi için Bkz:
Bir bağlantı kolunda asenkron olarak çalışan bir fonksiyonu iptal etmek. SQLCancelHandle Fonksiyonu
Bir sürücü veya veri kaynağı hakkında bilgi döndürmek SQLGetInfo Fonksiyonu
Bir sapı serbest bırakmak SQLFreeHandle Fonksiyonu
Bir ifade tutamacının serbest bırakılması SQLFreeStmt İşlevi