Recentemente, um cliente que estava usando nosso driver ODBC do SQL Server para conectar o Oracle® no Linux ao SQL Server perguntou se era possível habilitar o nível de isolamento de instantâneo de uma fonte de dados ODBC.
Você pode habilitar esse nível de isolamento definindo um atributo de conexão em uma chamada SQLSetConnectAttr. No entanto, esse método não é aplicável se você não tiver acesso ao código-fonte do aplicativo, como ocorreu com nosso cliente Oracle®.
Como alternativa, você pode usar um mecanismo fornecido pelo Gerenciador de Driver unixODBC para definir os atributos de conexão:
DMConnAttr=[attribute]=value
Observação Você precisa da versão 1.9.10+ do driver ODBC do SQL Server para definir atributos de conexão por meio de
DMConnAttr
. O atributo e o valor relevantes para o nível de isolamento do instantâneo estão contidos no arquivo de cabeçalho do SQL Server sqlncli.h, que está contido na distribuição do driver ODBC do 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)
que nos dá a seguinte linha para adicionar à nossa fonte de dados ODBC:
DMConnAttr=[1227]=\32
1227 é o atributo (1200+27) e 32 é o valor (o valor decimal de 0x00000020L é 32).
Para testar se nossas configurações estavam corretas, nós:
$ 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