Kürzlich fragte ein Kunde, der unseren SQL Server ODBC-Treiber verwendete, um Oracle® unter Linux mit SQL Server zu verbinden, ob es möglich sei, die Snapshot-Isolationsstufe von einer ODBC-Datenquelle aus zu aktivieren.
Sie können diese Isolationsstufe aktivieren, indem Sie ein Verbindungsattribut in einem SQLSetConnectAttr-Aufruf festlegen. Diese Methode ist jedoch nicht anwendbar, wenn Sie keinen Zugriff auf den Quellcode der Anwendung haben, wie es bei unserem Oracle®-Kunden der Fall war.
Alternativ können Sie einen vom unixODBC-Treiber-Manager bereitgestellten Mechanismus verwenden, um Verbindungsattribute festzulegen:
DMConnAttr=[attribute]=value
Hinweis Sie benötigen 1.9.10+ des SQL Server ODBC-Treibers, um Verbindungsattribute über DMConnAttr
festzulegen .
Das relevante Attribut und der Wert für die Snapshot-Isolationsstufe sind in der SQL Server-Headerdatei sqlncli.h enthalten, die in der SQL Server-ODBC-Treiberverteilung enthalten ist:
#define SQL_COPT_SS_BASE 1200 #define SQL_TXN_SS_SNAPSHOT 0x00000020L #define SQL_COPT_SS_TXN_ISOLATION (SQL_COPT_SS_BASE+27)
was uns die folgende Zeile zum Hinzufügen zu unserer ODBC-Datenquelle gibt:
DMConnAttr=[1227]=\32
1227 ist das Attribut (1200+27) und 32 ist der Wert (der Dezimalwert von 0x00000020L ist 32).
Um zu testen, ob unsere Einstellungen korrekt waren, haben wir:
$ more /etc/odbc.ini [SQLSERVER_SAMPLE] Driver=Easysoft ODBC-SQL Server Server=myserver Port=50217 Database=adventureworks User=sa Password=p455w0rd $ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE SQL> SELECT CASE transaction_isolation_level WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END FROM sys.dm_exec_sessions where session_id = @@SPID ReadCommitted more /etc/odbc.ini [SQLSERVER_SAMPLE] Driver=Easysoft ODBC-SQL Server Server=myserver Port=50217 Database=adventureworks User=sa Password=p455w0rd DMConnAttr=[1227]=\32 $ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE SQL> SELECT CASE transaction_isolation_level WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END FROM sys.dm_exec_sessions where session_id = @@SPID Snapshot