Nyligen frågade en kund som använde vår SQL Server ODBC-drivrutin för att ansluta Oracle® på Linux till SQL Server om det var möjligt att aktivera isoleringsnivån för ögonblicksbild från en ODBC-datakälla.
Du kan aktivera denna isoleringsnivå genom att ställa in ett anslutningsattribut i ett SQLSetConnectAttr-anrop. Den här metoden är dock inte tillämplig om du inte har tillgång till programmets källkod, vilket var fallet med vår Oracle®-kund.
Som ett alternativ kan du använda en mekanism som tillhandahålls av unixODBC Driver Manager för att ställa in anslutningsattribut:
DMConnAttr=[attribute]=value
Obs Du behöver 1.9.10+ av SQL Server ODBC-drivrutinen för att ställa in anslutningsattribut via DMConnAttr
.
Det relevanta attributet och värdet för ögonblicksbildsisoleringsnivån finns i SQL Server-huvudfilen sqlncli.h, som finns i SQL Server ODBC-drivrutinsdistributionen:
#define SQL_COPT_SS_BASE 1200 #define SQL_TXN_SS_SNAPSHOT 0x00000020L #define SQL_COPT_SS_TXN_ISOLATION (SQL_COPT_SS_BASE+27)
vilket ger oss följande rad att lägga till i vår ODBC-datakälla:
DMConnAttr=[1227]=\32
1227 är attributet (1200+27) och 32 är värdet (decimalvärdet på 0x00000020L är 32).
För att testa att våra inställningar var korrekta:
$ 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