Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mendaftar SQL Server dalam Transaksi XA Terdistribusi

Cara mengakses SQL Server dalam konteks transaksi XA dengan driver ODBC Easysoft SQL Server dan Oracle Tuxedo.

Pengantar

Mengapa Diperlukan Transaksi Terdistribusi

Transaksi adalah serangkaian tindakan yang dilakukan sebagai satu operasi di mana semua tindakan dilakukan atau tidak ada satupun yang dilakukan. Transaksi diakhiri dengan tindakan komit yang membuat perubahan permanen. Jika salah satu perubahan tidak dapat dilakukan, transaksi akan dibatalkan, membalikkan semua perubahan.

Transaksi terdistribusi adalah transaksi yang dapat menjangkau banyak sumber daya. Misalnya, satu atau lebih database atau database dan antrian pesan. Agar transaksi berhasil dilakukan, semua sumber daya individu harus berhasil; jika salah satu dari mereka tidak berhasil, transaksi harus memutar kembali semua sumber daya. Misalnya, transaksi terdistribusi mungkin terdiri dari transfer uang antara dua rekening bank, yang diselenggarakan oleh bank yang berbeda, dan juga pada basis data yang berbeda. Anda tidak ingin salah satu transaksi dilakukan tanpa jaminan bahwa keduanya akan berhasil diselesaikan. Jika tidak, data dapat digandakan (jika penyisipan selesai dan penghapusan gagal) atau hilang (jika penghapusan selesai dan penyisipan gagal).

Setiap kali aplikasi perlu mengakses atau memperbarui data dalam beberapa sumber daya transaksional karena itu, harus menggunakan transaksi terdistribusi. Dimungkinkan untuk menggunakan transaksi terpisah pada setiap sumber daya, tetapi pendekatan ini rawan kesalahan. Jika transaksi di salah satu resource berhasil di-commit tetapi yang lain gagal dan harus di-roll back, transaksi pertama tidak bisa lagi di-rollback, sehingga status aplikasi menjadi tidak konsisten. Jika satu sumber daya berhasil dikomit tetapi sistem macet sebelum sumber daya lainnya berhasil dikomit, aplikasi kembali tidak konsisten.

XA

Model X/Open Distributed Transaction Processing (DTP) mendefinisikan arsitektur untuk pemrosesan transaksi terdistribusi. Dalam arsitektur DTP, manajer transaksi yang terkoordinasi memberi tahu setiap sumber daya bagaimana memproses transaksi, berdasarkan pengetahuannya tentang semua sumber daya yang berpartisipasi dalam transaksi. Sumber daya yang biasanya mengelola komit dan pemulihan transaksi mereka sendiri mendelegasikan tugas ini kepada manajer transaksi.

Spesifikasi XA arsitektur menyediakan standar terbuka yang memastikan interoperabilitas di seluruh middleware transaksional dan produk database yang sesuai. Oleh karena itu, sumber daya yang berbeda ini dapat berpartisipasi bersama dalam transaksi terdistribusi.

Model DTP mencakup tiga komponen yang saling terkait:

  • Program Aplikasi yang mendefinisikan batasan transaksi dan menentukan tindakan yang merupakan transaksi.
  • Pengelola Sumber Daya seperti database atau sistem file yang menyediakan akses ke sumber daya bersama.
  • Manajer Transaksi yang menetapkan pengenal untuk transaksi, memantau kemajuannya, dan bertanggung jawab atas penyelesaian transaksi dan pemulihan kegagalan.

Standar XA mendefinisikan protokol komit dua fase dan antarmuka yang digunakan untuk komunikasi antara Manajer Transaksi dan Manajer Sumber Daya. Protokol komit dua fase memberikan jaminan semua atau tidak sama sekali bahwa semua peserta yang terlibat dalam transaksi melakukan atau memutar kembali bersama-sama. Oleh karena itu, seluruh transaksi dilakukan atau seluruh transaksi dibatalkan.

Komit dua fase terdiri dari fase persiapan dan fase komit. Selama fase persiapan, semua peserta dalam transaksi harus setuju untuk menyelesaikan perubahan yang diperlukan oleh transaksi. Jika salah satu peserta melaporkan masalah, fase persiapan akan gagal dan transaksi akan dibatalkan. Jika fase persiapan berhasil, fase dua, fase komit dimulai. Selama fase komit, Manajer Transaksi menginstruksikan semua peserta untuk melakukan transaksi.

SQL Server dan XA

Untuk mengaktifkan dukungan XA di SQL Server 2019, ikuti petunjuk di bagian "Menjalankan layanan MS DTC" yang terdapat dalam dokumen ini:

Memahami transaksi XA

Untuk mengaktifkan dukungan XA di versi SQL Server sebelumnya, ikuti petunjuk dalam dokumen ini:

Mengonfigurasi transaksi XA di Microsoft SQL Server untuk IBM Business Process Manager (BPM)

Driver SQL Server ODBC telah diuji dengan instans SQL Server 2016 dan 2019.

Driver ODBC Easysoft SQL Server

Dukungan XA telah ditambahkan ke driver SQL Server ODBC di versi 1.11.3. Dukungan XA driver telah diuji dengan Oracle Tuxedo dan SQL Server 2016 dan 2019.

Untuk mendaftarkan driver SQL Server ODBC dalam transaksi XA, Anda perlu menggunakan struktur bernama es_xa_context dalam aplikasi Anda. es_xa_context menghubungkan ke sumber data ODBC yang telah Anda tentukan dalam konfigurasi manajer sumber daya XA Anda dan mengembalikan pegangan koneksi. Misalnya:

int ret;
SQLHANDLE hEnv, hConn;
ret = es_xa_context( NULL, &hEnv, &hConn );

Di Tuxedo, sumber data ODBC yang es_xa_context terhubung ke ditentukan dalam Manajer Sumber Daya OPENINFO string dalam file konfigurasi Tuxedo. Dalam contoh ini, "SQLSERVER_SAMPLE":

OPENINFO="EASYSOFT_SQLSERVER_ODBC:DSN=SQLSERVER_SAMPLE"

Nama Manajer Sumber Daya XA dan sakelar XA yang ditentukan driver adalah EASYSOFT_SQLSERVER_ODBC dan essql_xaosw .

Di Tuxedo, Anda menentukan ini di file definisi Pengelola Sumber Daya Tuxedo, ${TUXDIR}/udataobj/RM . Misalnya:

EASYSOFT_SQLSERVER_ODBC:essql_xaosw:-L/usr/local/easysoft/sqlserver/lib -lessqlsrv -lodbcinst

Contoh Aplikasi Easysoft / Tuxedo / SQL Server XA

Pertama, siapkan sumber data driver SQL Server ODBC yang terhubung ke instance SQL Server berkemampuan XA:

  1. Pada mesin Tuxedo Anda, instal driver SQL Server ODBC.
  2. Buat sumber data driver ODBC SQL Server di odbc.ini. Misalnya:
    [SQLSERVER_SAMPLE]
    Driver=Easysoft ODBC-SQL Server
    Description=Easysoft SQL Server ODBC driver
    Server=mymachine\myxaenabledinstance
    User=mydomain\myuser
    Password=mypassword
    Database=XA1
  3. Buat tabel contoh untuk aplikasi Tuxedo:
    $ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE
    SQL> CREATE TABLE [dbo].[tx_test1]([i] [int] NULL,[c] [varchar](100) NULL)

Buat dan jalankan contoh Aplikasi Tuxedo XA.

  1. $ cd ~
    $ mkdir simpdir
    $ cd simpdir
    $ touch simpcl.c simpserv.c ubbsimple
  2. Tambahkan baris berikut ke simpcl.c:
    #include <stdio.h>
    #include "atmi.h"               /* TUXEDO  Header File */
    
    
    #if defined(__STDC__) || defined(__cplusplus)
    main(int argc, char *argv[])
    #else
    main(argc, argv)
    int argc;
    char *argv[];
    #endif
    
    {
    
            char *sendbuf, *rcvbuf;
            long sendlen, rcvlen;
            int ret;
    
            if(argc != 2) {
                    (void) fprintf(stderr, "Usage: simpcl <SQL>\n");
                    exit(1);
            }
    
            /* Attach to System/T as a Client Process */
            if (tpinit((TPINIT *) NULL) == -1) {
                    (void) fprintf(stderr, "Tpinit failed\n");
                    exit(1);
            }
    
            sendlen = strlen(argv[1]);
    
            /* Allocate STRING buffers for the request and the reply */
    
            if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
                    (void) fprintf(stderr,"Error allocating send buffer\n");
                    tpterm();
                    exit(1);
            }
    
            if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
                    (void) fprintf(stderr,"Error allocating receive buffer\n");
                    tpfree(sendbuf);
                    tpterm();
                    exit(1);
            }
    
            (void) strcpy(sendbuf, argv[1]);
    
            /* Request the service EXECUTE, waiting for a reply */
            ret = tpcall("EXECUTE", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);
    
            if(ret == -1) {
                    (void) fprintf(stderr, "Can't send request to service EXECUTE\n");
                    (void) fprintf(stderr, "Tperrno = %d\n", tperrno);
                    tpfree(sendbuf);
                    tpfree(rcvbuf);
                    tpterm();
                    exit(1);
            }
    
            (void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);
    
            /* Free Buffers & Detach from System/T */
            tpfree(sendbuf);
            tpfree(rcvbuf);
            tpterm();
            return(0);
    }
  3. Tambahkan baris berikut ke simpserv.c:
    #include <stdio.h>
    #include <ctype.h>
    #include <atmi.h>       /* TUXEDO Header File */
    #include <userlog.h>    /* TUXEDO Header File */
    #include <xa.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <string.h>
    
    
    /* tpsvrinit is executed when a server is booted, before it begins
       processing requests.  It is not necessary to have this function.
       Also available is tpsvrdone (not used in this example), which is
       called at server shutdown time.
    */
    
    
    int tpsvrinit(int argc, char *argv[])
    {
            int ret;
    
            /* Some compilers warn if argc and argv aren't used. */
            argc = argc;
            argv = argv;
    
            /* simpapp is non-transactional, so there is no need for tpsvrinit()
               to call tx_open() or tpopen().  However, if this code is modified
               to run in a Tuxedo group associated with a Resource Manager then
               either a call to tx_open() or a call to tpopen() must be inserted
               here.
            */
    
            /* userlog writes to the central TUXEDO message log */
            userlog("Welcome to the simple server");
    
            ret = tpopen();
    
            userlog("tpopen returned %d, error=%x", ret, tperrno );
    
            return(0);
    }
    
    void tpsvrdone( void )
    {
            int ret;
    
            ret = tpclose();
    
            userlog("tpclose returned %d", ret);
    }
    
    /* This function performs the actual service requested by the client.
       Its argument is a structure containing among other things a pointer
       to the data buffer, and the length of the data buffer.
    */
    
    xa_open_entry() call.
    int es_xa_context( int* rmid, SQLHANDLE* henv, SQLHANDLE* hdbc );
    
    void EXECUTE(TPSVCINFO *rqst)
    {
            int ret;
            char *result;
            SQLHANDLE hStmt;
            char str[ 256 ];
            SQLHANDLE hEnv, hConn;
            SQLSMALLINT slen;
    
            ret = es_xa_context( NULL, &hEnv, &hConn );
    
            userlog("es_xa_context returns %d, hEnv = %p, hConn = %p", ret, hEnv, hConn );
    
            if ( ret != 0 ) {
                    result = tpalloc( "STRING", "*", 128 );
                    sprintf( result, "es_xa_context returned %d", ret );
    
                    /* Return the transformed buffer to the requestor. */
                    tpreturn(TPSUCCESS, 0, result, strlen( result ), 0);
            }
            else {
    
                    ret = tpbegin( 0, 0 );
    
                    ret = SQLAllocHandle( SQL_HANDLE_STMT, hConn, &hStmt );
    
                    ret = SQLExecDirect( hStmt, rqst -> data, rqst -> len );
    
                    ret = SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
    
                    ret = tpcommit( 0 );
    
                    result = tpalloc( "STRING", "*", 128 );
                    sprintf( result, "tpcommit returns %d", ret );
    
                    /* Return the transformed buffer to the requestor. */
                    tpreturn(TPSUCCESS, 0, result, strlen( result ), 0);
            }
    }
  4. Tambahkan baris berikut ke ubbsimple:
    *RESOURCES
    IPCKEY          123456
    
    DOMAINID        simpapp
    MASTER          simple
    MAXACCESSERS    20
    MAXSERVERS      10
    MAXSERVICES     10
    MODEL           SHM
    LDBAL           N
    
    *MACHINES
    DEFAULT:
                    APPDIR="/home/myuser/simpdir"
                    TUXCONFIG="/home/myuser/simpdir/tuxconfig"
                    TUXDIR="/home/myuser/OraHome/tuxedo12.2.2.0.0"
    
    mymachine         LMID=simple
    
    TLOGNAME=TLOG
    TLOGDEVICE="/home/myuser/simpdir/tuxlog"
    
    
    *GROUPS
    GROUP1
            LMID=simple     GRPNO=1 OPENINFO=NONE
            TMSNAME=mySQLSERVER_TMS
            OPENINFO="EASYSOFT_SQLSERVER_ODBC:DSN=SQLSERVER_SAMPLE"
    
    *SERVERS
    DEFAULT:
                    CLOPT="-A"
    
    simpserv        SRVGRP=GROUP1 SRVID=1
    
    *SERVICES
    EXECUTE
  5. Setel lingkungan Anda:
    export TUXDIR=/home/myuser/OraHome/tuxedo12.2.2.0.0
    export TUXCONFIG=/home/myuser/simpdir/tuxconfig
    export PATH=$PATH:$TUXDIR/bin
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib:/usr/local/easysoft/unixODBC/lib: \
    /usr/local/easysoft/sqlserver/lib:/usr/local/easysoft/lib
  6. Buat klien sampel:
    buildclient -o simpcl -f simpcl.c

    Jika Anda mendapatkan kesalahan "referensi tidak terdefinisi ke dlopen" saat membangun klien, coba perintah ini sebagai gantinya:

    buildclient -o simpcl -f "-Xlinker --no-as-needed simpcl.c"
  7. Buat server sampel:
    buildserver -r EASYSOFT_SQLSERVER_ODBC -s EXECUTE -o simpserv -f "simpserv.c \
    -L/usr/local/easysoft/sqlserver/lib -lessqlsrv -lodbc"
  8. Buat file TUXCONFIG untuk contoh aplikasi:
    tmloadcf ubbsimple
  9. Buat perangkat pencatatan Tuxedo untuk aplikasi sampel:
    $ tmadmin -c
    > crdl -z /home/myuser/simpdir/tuxlog -b 512
  10. Buat pengelola transaksi Tuxedo yang berinteraksi dengan driver SQL Server ODBC:
    $ buildtms -o mySQLSERVER_TMS -r EASYSOFT_SQLSERVER_ODBC
  11. Boot server sampel:
    $ tmboot
  12. Uji aplikasi sampel:
    ./simpcl "insert into tx_test1 values( 1, 'hello world' )"
    /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE
    SQL> select * from tx_test1
    +------------+--------------+
    | i          | c            |                                                                                                   
    +------------+--------------+
    | 1          | hello world  |                                                                                         
    +------------+--------------+
  13. Jika Anda melihat data di tabel SQL Server, matikan server sampel:
    tmshutdown

    Jika tidak, lihat ULOG.nnn di direktori aplikasi contoh.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL WHERE.. IN klausa beberapa kolom

  2. Bagaimana cara memperbaiki konflik pemeriksaan dalam kueri SQL Server?

  3. EXISTS vs JOIN dan penggunaan klausa EXISTS

  4. Kelompokkan berdasarkan kolom dan beberapa Baris menjadi Satu Baris beberapa kolom

  5. Operator agregat perkalian dalam SQL