Здравствуйте.
Подключаюсь к базе из 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
Уровень изоляции в ODBC
Модератор: kdv
Re: Уровень изоляции в ODBC
какую именно?seevi писал(а):Оператор set transaction isolation level snapshot вызывает ошибку
Re: Уровень изоляции в ODBC
Например, фрагмент вызывает ошибку на строке с вызовом execute ():
DBD::ODBC::st execute failed: [ODBC Red Database Driver]Function sequence error (SQL-HY010)
Фрагмент вызывает ошибку:
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)
Код: Выделить всё
my $statement = $db->prepare ('set transaction isolation level snaphot');
$statement->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)
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Уровень изоляции в ODBC
В документации к ODBC драйверу (которую ты, конечно, читал) чёрным по белому написано:
Что у perl служит обёрткой к SQLExecDirect - мне неизвестно.Начиная с версии v2.0, Firebird ODBC поддерживает все без исключения типы транзакций, которые может обеспечить сервер, включая блокирование таблиц. Для этого был добавлен SQL синтаксис(GPRE), который выполняется ODBC API функцией SQLExecDirect.