For nylig spurgte en kunde, der brugte vores SQL Server ODBC-driver til at forbinde Oracle® på Linux til SQL Server, om det var muligt at aktivere snapshot-isolationsniveauet fra en ODBC-datakilde.
Du kan aktivere dette isolationsniveau ved at indstille en forbindelsesattribut i et SQLSetConnectAttr-kald. Denne metode er dog ikke anvendelig, hvis du ikke har adgang til applikationens kildekode, som det var tilfældet med vores Oracle®-kunde.
Som et alternativ kan du bruge en mekanisme leveret af unixODBC Driver Manager til at indstille forbindelsesattributter:
DMConnAttr=[attribute]=value
Bemærk Du skal bruge 1.9.10+ af SQL Server ODBC-driveren for at indstille forbindelsesattributter via DMConnAttr
.
Den relevante attribut og værdi for snapshot-isolationsniveau er indeholdt i SQL Server-header-filen sqlncli.h, som er indeholdt i SQL Server ODBC-driverdistributionen:
#define SQL_COPT_SS_BASE 1200 #define SQL_TXN_SS_SNAPSHOT 0x00000020L #define SQL_COPT_SS_TXN_ISOLATION (SQL_COPT_SS_BASE+27)
hvilket giver os følgende linje at tilføje til vores ODBC-datakilde:
DMConnAttr=[1227]=\32
1227 er attributten (1200+27) og 32 er værdien (decimalværdien af 0x00000020L er 32).
For at teste, at vores indstillinger var korrekte, gør vi:
$ 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