Recientemente, un cliente que estaba usando nuestro controlador ODBC de SQL Server para conectar Oracle® en Linux a SQL Server, preguntó si era posible habilitar el nivel de aislamiento de instantáneas desde una fuente de datos ODBC.
Puede habilitar este nivel de aislamiento configurando un atributo de conexión en una llamada SQLSetConnectAttr. Sin embargo, este método no es aplicable si no tiene acceso al código fuente de la aplicación, como fue el caso de nuestro cliente de Oracle®.
Como alternativa, puede utilizar un mecanismo proporcionado por unixODBC Driver Manager para configurar los atributos de conexión:
DMConnAttr=[attribute]=value
Nota Necesita 1.9.10+ del controlador ODBC de SQL Server para establecer atributos de conexión a través de DMConnAttr
.
El atributo y el valor relevantes para el nivel de aislamiento de la instantánea se encuentran en el archivo de encabezado de SQL Server sqlncli.h, que se encuentra en la distribución del controlador ODBC de SQL Server:
#define SQL_COPT_SS_BASE 1200 #define SQL_TXN_SS_SNAPSHOT 0x00000020L #define SQL_COPT_SS_TXN_ISOLATION (SQL_COPT_SS_BASE+27)
lo que nos da la siguiente línea para agregar a nuestra fuente de datos ODBC:
DMConnAttr=[1227]=\32
1227 es el atributo (1200+27) y 32 es el valor (el valor decimal de 0x00000020L es 32).
Para probar que nuestra configuración era correcta, nosotros:
$ 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