Niedawno klient, który używał naszego sterownika ODBC SQL Server do łączenia Oracle® w systemie Linux z SQL Server, zapytał, czy jest możliwe włączenie poziomu izolacji migawki ze źródła danych ODBC.
Ten poziom izolacji można włączyć, ustawiając atrybut połączenia w wywołaniu SQLSetConnectAttr. Jednak ta metoda nie ma zastosowania, jeśli nie masz dostępu do kodu źródłowego aplikacji, jak miało to miejsce w przypadku naszego klienta Oracle®.
Alternatywnie możesz użyć mechanizmu udostępnionego przez menedżera sterowników unixODBC do ustawienia atrybutów połączenia:
DMConnAttr=[attribute]=value
Uwaga Aby ustawić atrybuty połączenia za pomocą DMConnAttr
, potrzebujesz wersji 1.9.10+ sterownika ODBC SQL Server .
Odpowiedni atrybut i wartość poziomu izolacji migawki są zawarte w pliku nagłówkowym SQL Server sqlncli.h, który jest zawarty w dystrybucji sterowników ODBC 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)
co daje nam następujący wiersz do dodania do naszego źródła danych ODBC:
DMConnAttr=[1227]=\32
1227 to atrybut (1200+27), a 32 to wartość (wartość dziesiętna 0x00000020L to 32).
Aby sprawdzić, czy nasze ustawienia są prawidłowe,:
$ 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