Easysoft SQL Server ODBC ड्राइवर और Oracle Tuxedo के साथ XA लेन-देन के संदर्भ में SQL सर्वर तक कैसे पहुँचें।
परिचय
वितरित लेनदेन की आवश्यकता क्यों है
एक लेन-देन एक एकल ऑपरेशन के रूप में की जाने वाली क्रियाओं की एक श्रृंखला है जिसमें या तो सभी क्रियाएं की जाती हैं या उनमें से कोई भी नहीं होती है। एक लेन-देन एक प्रतिबद्ध कार्रवाई के साथ समाप्त होता है जो परिवर्तनों को स्थायी बनाता है। यदि कोई भी परिवर्तन नहीं किया जा सकता है, तो लेन-देन सभी परिवर्तनों को उलटते हुए वापस आ जाएगा।
एक वितरित लेनदेन एक लेनदेन है जो कई संसाधनों को फैला सकता है। उदाहरण के लिए, एक या अधिक डेटाबेस या एक डेटाबेस और एक संदेश कतार। लेन-देन को सफलतापूर्वक करने के लिए, सभी व्यक्तिगत संसाधनों को सफलतापूर्वक प्रतिबद्ध होना चाहिए; यदि उनमें से कोई भी असफल होता है, तो लेन-देन को सभी संसाधनों में वापस रोलबैक करना होगा। उदाहरण के लिए, एक वितरित लेनदेन में दो बैंक खातों के बीच एक धन हस्तांतरण शामिल हो सकता है, जिसे विभिन्न बैंकों द्वारा होस्ट किया जाता है, और इसी तरह विभिन्न डेटाबेस पर भी। आप नहीं चाहेंगे कि कोई भी लेन-देन इस गारंटी के बिना किया जाए कि दोनों सफलतापूर्वक पूर्ण हो जाएंगे। अन्यथा, डेटा डुप्लिकेट हो सकता है (यदि इंसर्ट पूरा हो जाता है और डिलीट विफल हो जाता है) या खो जाता है (यदि डिलीट पूरा हो जाता है और इंसर्ट विफल हो जाता है)।
जब भी किसी एप्लिकेशन को कई लेन-देन संबंधी संसाधनों में डेटा तक पहुंचने या अपडेट करने की आवश्यकता होती है, तो उसे एक वितरित लेनदेन का उपयोग करना चाहिए। प्रत्येक संसाधन पर एक अलग लेनदेन का उपयोग करना संभव है, लेकिन यह दृष्टिकोण त्रुटि-प्रवण है। यदि एक संसाधन में लेनदेन सफलतापूर्वक हो जाता है, लेकिन दूसरा विफल हो जाता है और उसे वापस रोल करना चाहिए, तो पहले लेनदेन को अब वापस नहीं किया जा सकता है, इसलिए आवेदन की स्थिति असंगत हो जाती है। यदि एक संसाधन सफलतापूर्वक काम करता है, लेकिन दूसरे संसाधन के सफलतापूर्वक प्रतिबद्ध होने से पहले सिस्टम क्रैश हो जाता है, तो एप्लिकेशन फिर से असंगत है।
XA
एक्स/ओपन डिस्ट्रिब्यूटेड ट्रांजैक्शन प्रोसेसिंग (डीटीपी) मॉडल डिस्ट्रिब्यूटेड ट्रांजैक्शन प्रोसेसिंग के लिए एक आर्किटेक्चर को परिभाषित करता है। डीटीपी आर्किटेक्चर में, एक समन्वयक लेनदेन प्रबंधक लेनदेन में भाग लेने वाले सभी संसाधनों के अपने ज्ञान के आधार पर प्रत्येक संसाधन को लेनदेन को संसाधित करने का तरीका बताता है। वे संसाधन जो आमतौर पर अपने स्वयं के लेन-देन का प्रबंधन करते हैं और पुनर्प्राप्ति इस कार्य को लेन-देन प्रबंधक को सौंपते हैं।
आर्किटेक्चर का एक्सए विनिर्देश एक खुला मानक प्रदान करता है जो अनुरूप ट्रांजेक्शनल मिडलवेयर और डेटाबेस उत्पादों में इंटरऑपरेबिलिटी सुनिश्चित करता है। इसलिए ये विभिन्न संसाधन एक वितरित लेनदेन में एक साथ भाग लेने में सक्षम हैं।
डीटीपी मॉडल में तीन परस्पर संबंधित घटक शामिल हैं:
- एक एप्लिकेशन प्रोग्राम जो लेन-देन की सीमाओं को परिभाषित करता है और एक लेनदेन का गठन करने वाली क्रियाओं को निर्दिष्ट करता है।
- संसाधन प्रबंधक जैसे डेटाबेस या फ़ाइल सिस्टम जो साझा संसाधनों तक पहुँच प्रदान करते हैं।
- एक लेन-देन प्रबंधक जो लेन-देन के लिए पहचानकर्ता निर्दिष्ट करता है, उनकी प्रगति की निगरानी करता है, और लेन-देन पूरा होने और विफलता की वसूली की जिम्मेदारी लेता है।
XA मानक दो-चरण प्रतिबद्ध प्रोटोकॉल और एक लेनदेन प्रबंधक और एक संसाधन प्रबंधक के बीच संचार के लिए उपयोग किए जाने वाले इंटरफ़ेस को परिभाषित करता है। दो-चरण प्रतिबद्ध प्रोटोकॉल एक सर्व-या-कुछ गारंटी प्रदान करता है कि लेनदेन में शामिल सभी प्रतिभागी या तो एक साथ प्रतिबद्ध या रोल बैक करते हैं। इसलिए संपूर्ण लेन-देन हो जाता है या संपूर्ण लेन-देन वापस आ जाता है।
दो-चरण की प्रतिबद्धता में एक तैयार चरण और एक प्रतिबद्ध चरण होता है। तैयारी चरण के दौरान, लेन-देन में सभी प्रतिभागियों को लेन-देन के लिए आवश्यक परिवर्तनों को पूरा करने के लिए सहमत होना चाहिए। यदि प्रतिभागियों में से कोई भी समस्या की रिपोर्ट करता है, तो तैयारी चरण विफल हो जाएगा और लेन-देन वापस आ जाएगा। यदि तैयारी चरण सफल होता है, चरण दो, प्रतिबद्ध चरण शुरू होता है। प्रतिबद्ध चरण के दौरान, लेनदेन प्रबंधक सभी प्रतिभागियों को लेनदेन करने का निर्देश देता है।
SQL सर्वर और XA
SQL सर्वर 2019 में XA समर्थन को सक्षम करने के लिए, इस दस्तावेज़ में निहित "एमएस डीटीसी सेवा चलाना" अनुभाग में दिए गए निर्देशों का पालन करें:
XA लेनदेन को समझना
SQL सर्वर के पुराने संस्करणों में XA समर्थन सक्षम करने के लिए, इस दस्तावेज़ में दिए गए निर्देशों का पालन करें:
आईबीएम बिजनेस प्रोसेस मैनेजर (बीपीएम) के लिए माइक्रोसॉफ्ट एसक्यूएल सर्वर में एक्सए लेनदेन को कॉन्फ़िगर करना
SQL सर्वर ODBC ड्राइवर का परीक्षण XA-सक्षम SQL Server 2016 और 2019 इंस्टेंस के साथ किया गया है।
ईज़ीसॉफ्ट SQL सर्वर ODBC ड्राइवर
संस्करण 1.11.3 में SQL सर्वर ODBC ड्राइवर में XA समर्थन जोड़ा गया था। ड्राइवर के XA सपोर्ट का Oracle Tuxedo और SQL Server 2016 और 2019 के साथ परीक्षण किया गया है।
SQL सर्वर ODBC ड्राइवर को XA लेन-देन में सूचीबद्ध करने के लिए, आपको es_xa_context
नामक संरचना का उपयोग करने की आवश्यकता है आपके आवेदन में। es_xa_context
आपके द्वारा अपने XA संसाधन प्रबंधक कॉन्फ़िगरेशन में निर्दिष्ट ODBC डेटा स्रोत से कनेक्ट होता है और एक कनेक्शन हैंडल देता है। उदाहरण के लिए:
int ret;SQLHANDLE hEnv, hConn;ret =es_xa_context(NULL, &hEnv, &hConn);
Tuxedo में, ODBC डेटा स्रोत जो es_xa_context
. है कनेक्ट करता है संसाधन प्रबंधक OPENINFO
. में निर्दिष्ट है Tuxedo कॉन्फ़िग फ़ाइल में string. इस उदाहरण में, यह "SQLSERVER_SAMPLE" है:
OPENINFO="EASYSOFT_SQLSERVER_ODBC:DSN=SQLSERVER_SAMPLE"
ड्राइवर-परिभाषित XA संसाधन प्रबंधक नाम और XA स्विच EASYSOFT_SQLSERVER_ODBC
हैं और essql_xaosw
.
Tuxedo में, आप इन्हें Tuxedo Resource Manager परिभाषा फ़ाइल ${TUXDIR}/udataobj/RM
में निर्दिष्ट करते हैं . उदाहरण के लिए:
EASYSOFT_SQLSERVER_ODBC:essql_xaosw:-L/usr/local/easysoft/sqlserver/lib -lessqlsrv -lodbcinst
नमूना Easysoft / Tuxedo / SQL Server XA अनुप्रयोग
सबसे पहले, एक SQL सर्वर ODBC ड्राइवर डेटा स्रोत सेट करें जो XA-सक्षम SQL सर्वर इंस्टेंस से कनेक्ट होता है:
- अपनी Tuxedo मशीन पर, SQL Server ODBC ड्राइवर स्थापित करें।
- odbc.ini में SQL सर्वर ODBC ड्राइवर डेटा स्रोत बनाएँ। उदाहरण के लिए:
[SQLSERVER_SAMPLE]Driver=Easysoft ODBC-SQL ServerDescription=Easysoft SQL Server ODBC DriverServer=mymachine\myxaenabledinstanceUser=mydomain\myuserPassword=mypasswordDatabase=XA1
- टक्सिडो एप्लिकेशन के लिए एक नमूना तालिका बनाएं:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLESQL> टेबल बनाएं [डीबीओ]। न्यूल, [सी] [वर्कर] (100) न्यूल)
नमूना Tuxedo XA एप्लिकेशन बनाएं और चलाएं।
-
$ cd ~$ mkdir simpdir$ cd simpdir$ simpcl.c simpserv.c ubbsimple को स्पर्श करें
- इन पंक्तियों को simpcl.c में जोड़ें:परिभाषित (__cplusplus) मुख्य (int argc, char *argv[])#elsemain(argc, argv)int argc;char *argv[];#endif{ char *sendbuf, *rcvbuf; लांग सेंडलेन, आरसीवीलेन; इंट रिट; if(argc !=2) {(void) fprintf(stderr, "Usage:simplecl
\n"); बाहर निकलें(1); } /* क्लाइंट प्रक्रिया के रूप में सिस्टम/टी से अटैच करें */ if (tpinit((TPINIT *) NULL) ==-1) { (शून्य) fprintf(stderr, "Tpinit विफल\n"); बाहर निकलें(1); } सेंडलेन =स्ट्रेलन (argv [1]); /* अनुरोध और उत्तर के लिए STRING बफ़र्स आवंटित करें */ if((sendbuf =(char *) tpalloc("STRING", NULL, sendlen+1)) ==NULL) {(शून्य) fprintf (stderr," त्रुटि आवंटित करने में बफर भेजें \ n"); टीपीटरम (); बाहर निकलें(1); } if((rcvbuf =(char *) tpalloc("STRING", NULL, sendlen+1)) ==NULL) {(शून्य) fprintf (stderr," बफ़र प्राप्त करने में त्रुटि \ n "); tpfree (sendbuf); टीपीटरम (); बाहर निकलें(1); } (शून्य) strcpy(sendbuf, argv[1]); /* सेवा का अनुरोध करें EXECUTE, उत्तर की प्रतीक्षा में */ ret =tpcall("EXECUTE", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0); if(ret ==-1) {(void) fprintf(stderr, "सेवा निष्पादन के लिए अनुरोध नहीं भेज सकता\n"); (शून्य) fprintf(stderr, "Tperrno =%d\n", tperrno); tpfree (sendbuf); टीपीफ्री (आरसीवीबीयूएफ); टीपीटरम (); बाहर निकलें(1); } (शून्य) fprintf(stdout, "रिटर्न स्ट्रिंग है:%s\n", rcvbuf); /* फ्री बफ़र्स और सिस्टम/टी से डिटैच करें */ tpfree(sendbuf); टीपीफ्री (आरसीवीबीयूएफ); टीपीटरम (); वापसी(0);} - इन पंक्तियों को simpserv.c में जोड़ें:
#include
#include #include /* TUXEDO Header File */#include / * TUXEDO हैडर फ़ाइल */#शामिल करें . यह फ़ंक्शन होना आवश्यक नहीं है। यह भी उपलब्ध है tpsvrdone (इस उदाहरण में उपयोग नहीं किया गया), जिसे सर्वर शटडाउन समय पर कहा जाता है।*/int tpsvrinit(int argc, char *argv[]){ int ret; /* कुछ कंपाइलर चेतावनी देते हैं कि क्या argc और argv का उपयोग नहीं किया जाता है। */ argc =argc; argv =argv; /* simpapp गैर-लेन-देन वाला है, इसलिए tpsvrinit() को tx_open() या tpopen() पर कॉल करने की कोई आवश्यकता नहीं है। हालांकि, अगर इस कोड को रिसोर्स मैनेजर से जुड़े Tuxedo समूह में चलाने के लिए संशोधित किया गया है तो या तो tx_open() पर कॉल करें या tpopen() पर कॉल डालें। */ /* उपयोगकर्ता लॉग केंद्रीय TUXEDO संदेश लॉग को लिखता है */ उपयोगकर्ता लॉग ("सरल सर्वर में आपका स्वागत है"); रिट =टीपोपेन (); userlog ("tpopen% d लौटा, त्रुटि =% x", ret, tperrno); वापसी (0);} शून्य tpsvrdone (शून्य) {इंट रिट; रिट =टीपीक्लोज़ (); userlog("tpclose लौटा %d", ret);}/* यह फ़ंक्शन क्लाइंट द्वारा अनुरोधित वास्तविक सेवा करता है। इसका तर्क एक संरचना है जिसमें अन्य चीजों के साथ डेटा बफर के लिए एक सूचक, और डेटा बफर की लंबाई होती है। TPSVCINFO *rqst){ इंट रिट; चार * परिणाम; SQLHANDLE hStmt; चार स्ट्र [256]; SQLHANDLE hEnv, hConn; SQLSMALLINT स्लैन; रिट =es_xa_context (न्यूल, और एचईएनवी, और एचकॉन); userlog ("es_xa_context% d, hEnv =% p, hConn =% p", ret, hEnv, hConn लौटाता है); अगर (रिट! =0) {परिणाम =tpalloc ("STRING", "*", 128); sprintf (परिणाम, "es_xa_context% d लौटा", रिट); / * परिवर्तित बफर को अनुरोधकर्ता को लौटाएं। */ tpreturn (TPSUCCESS, 0, परिणाम, strlen (परिणाम), 0); } और { रिट =टीपीबीगिन (0, 0); रिट =SQLAllocHandle (SQL_HANDLE_STMT, hConn, और hStmt); रिट =SQLExecDirect (hStmt, rqst -> डेटा, rqst -> लेन); रिट =SQLFreeHandle (SQL_HANDLE_STMT, hStmt); रिट =टीपीकॉमिट (0); परिणाम =tpalloc ("STRING", "*", 128); sprintf (परिणाम, "tpcommit रिटर्न% d", रिट); / * परिवर्तित बफर को अनुरोधकर्ता को लौटाएं। */ tpreturn (TPSUCCESS, 0, परिणाम, strlen (परिणाम), 0); }} - इन पंक्तियों को ubbsimple में जोड़ें:
*RESOURCESIPCKEY 123456DOMAINID simpappMASTER simpleMAXACCESSERS 20MAXSERVERS 10MAXSERVICES 10MODEL SHMLDBAL N*MACHINESDEFAULT:APPDIR="/home/myuser/simpdir" TUXCONFIG="/home/myuser/simpdir" TUXCONFIG="/home/ /home/myuser/OraHome/tuxedo12.2.2.0.0"mymachine LMID=simpleTLOGNAME=TLOGTLOGDEVICE="/home/myuser/simpdir/tuxlog"*GROUPSGROUP1 LMID=simple GRPNO=1SY OPENINFO=NONE TMSNAME=mySQLSERVER_TMS OPENSOFTINFO =SQLSERVER_SAMPLE"*SERVERSDEFAULT:CLOPT="-A"simpserv SRVGRP=GROUP1 SRVID=1*SERVICESEXECUTE
- अपना वातावरण सेट करें:$TUXDIR/lib:/usr/लोकल/ईज़ीसॉफ्ट/यूनिक्सओडीबीसी/लिब:\/usr/लोकल/ईज़ीसॉफ्ट/एसक्लसर्वर/लिब:/usr/लोकल/ईज़ीसॉफ्ट/लिब
- नमूना क्लाइंट बनाएं:
buildclient -o simpcl -f simpcl.c
यदि क्लाइंट बनाते समय आपको "dlopen के लिए अपरिभाषित संदर्भ" त्रुटि मिलती है, तो इसके बजाय इस आदेश को आजमाएं:
बिल्ड क्लाइंट -ओ सिंपल-एफ "-एक्सलिंकर --नो-एज़-नीडेड सिंपल.सी"
- नमूना सर्वर बनाएँ:
- नमूना आवेदन के लिए TUXCONFIG फ़ाइल बनाएँ:
tmloadcf ubbsimple
- नमूना एप्लिकेशन के लिए एक Tuxedo लॉगिंग डिवाइस बनाएं:
$ tmadmin -c> crdl -z /home/myuser/simpdir/tuxlog -b 512
- एक Tuxedo लेनदेन प्रबंधक बनाएं जो SQL सर्वर ODBC ड्राइवर के साथ इंटरफेस करता है:
$ buildtms -o mySQLSERVER_TMS -r EASYSOFT_SQLSERVER_ODBC
- नमूना सर्वर को बूट करें:
$ tmboot
- नमूना आवेदन का परीक्षण करें:------------+--------------+| मैं | सी | +---------------+--------------+| 1 | हैलो वर्ल्ड | +---------------+--------------+
- यदि आप SQL सर्वर तालिका में डेटा देखते हैं, तो नमूना सर्वर बंद करें:
tmshutdown
अन्यथा, नमूना आवेदन निर्देशिका में ULOG.nnn से परामर्श लें।