Уровень изоляции в ODBC

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
seevi
Сообщения: 9
Зарегистрирован: 25 ноя 2011, 13:51

Уровень изоляции в ODBC

Сообщение seevi » 05 апр 2012, 11:53

Здравствуйте.
Подключаюсь к базе из Perl через ODBC (DBD::ODBC), и мне нужен уровень изоляции snapshot. Можно ли его указать прямо в строке подключения? По умолчанию стоит уровень read committed no record_version infinite wait - видно в таблицах мониторинга. Сейчас используется следующая строка подключения: "driver=Red Database/Firebird driver; dbname=server:db_alias; uid=xxx; password=xxx;". Пробовал добавлять туда "concurrency=lock" (вычитал из документации к пакету tclodbc для Tcl/Tk) - эффекта ноль, вместо этого можно добавить строку с любой чушью, и она спокойно прожуется.
Оператор set transaction isolation level snapshot вызывает ошибку, хотя, согласно руководству SQL к Firebird 2.1, он относится к DSQL.
В ODBC не разбираюсь, к сожалению, почему и спрашиваю. Найденная мной информация по ODBC содержит либо кучу C++ кода, либо руководства по настройке источников данных в панели управления винды.
Существует Perl-драйвер для Firebird/Red Database, но немного смущает его номер версии (0.xx), не хочется на боевой базе такое применять. Существует также пакет Win32::ODBC или наподобие, который, думаю, поддерживает уровни изоляции, но у него совершенно другой интерфейс, и придется много переписывать.
Red Database 2.1.3.8496, Windows XP SP3 x86

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Уровень изоляции в ODBC

Сообщение dimitr » 05 апр 2012, 21:53

seevi писал(а):Оператор set transaction isolation level snapshot вызывает ошибку
какую именно?

seevi
Сообщения: 9
Зарегистрирован: 25 ноя 2011, 13:51

Re: Уровень изоляции в ODBC

Сообщение seevi » 06 апр 2012, 09:55

Например, фрагмент

Код: Выделить всё

my $statement = $db->prepare ('set transaction isolation level snaphot');
$statement->execute ();
вызывает ошибку на строке с вызовом execute ():

DBD::ODBC::st execute failed: [ODBC Red Database Driver]Function sequence error (SQL-HY010)

Фрагмент

Код: Выделить всё

$db->do ('set transaction isolation level snapshot');
вызывает ошибку:

DBD::ODBC::db do failed: Unable to fetch information about the error

Если подключаться через драйвер Firebird/Interbase(r) driver (с ним все остальные запросы отрабатывают нормально), то в обоих случаях ошибка другая:

DBD::ODBC::st execute failed: invalid transaction handle (expecting explicit transaction start) (SQL-HY000)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Уровень изоляции в ODBC

Сообщение Dimitry Sibiryakov » 06 апр 2012, 14:42

В документации к ODBC драйверу (которую ты, конечно, читал) чёрным по белому написано:
Начиная с версии v2.0, Firebird ODBC поддерживает все без исключения типы транзакций, которые может обеспечить сервер, включая блокирование таблиц. Для этого был добавлен SQL синтаксис(GPRE), который выполняется ODBC API функцией SQLExecDirect.
Что у perl служит обёрткой к SQLExecDirect - мне неизвестно.

Ответить