Страница 1 из 1
.NET FirebirdClient лочатся процедуры
Добавлено: 20 авг 2007, 22:28
Dreamer
история такая: используем из шарповского кода firebird версии 2.0.1 через FirebirdClient ADO 2.0 для вызова хранимых процедур, время от времени стали замечать что ibexpert не может перелить какую либо процу ругаясь на lock conflict. путем эксперемента выяснили что это происходит после того как процедура была выполнена FirebirdClient-ом. причем как с явным так и не явным использованием транзакции. кто нибудь сталкивался с этим ? это баг FirebirdClient ?
Добавлено: 21 авг 2007, 00:40
kdv
"перелить"?
именно "lock conflict" ?
у вас прямо во время работы настоятельная потребность альтерить используемые процедуры???
Добавлено: 21 авг 2007, 10:52
Dreamer
kdv писал(а):"перелить"?
ну всмысле ALTER PROCEDURE
kdv писал(а):именно "lock conflict" ?
ага, точнее:
lock conflict on no wait transaction
unsuccessful metadata update
object ... is in use
kdv писал(а):у вас прямо во время работы настоятельная потребность альтерить используемые процедуры???
хм, если транзакцию закоммители, а соединение закрыли то наверно проца должна считаться уже не используемой ?
к ошибке приводит уже такое консольное приложение:
Код: Выделить всё
FbConnection cn = new FbConnection("User=SYSDBA;Password=...;Database=...;DataSource=172.17.1.200;Port=3050;Charset=WIN1251");
cn.Open();
FbTransaction tran = cn.BeginTransaction(
FbTransactionOptions.NoWait |
FbTransactionOptions.ReadCommitted |
FbTransactionOptions.RecVersion |
FbTransactionOptions.Read |
FbTransactionOptions.Write);
try
{
FbCommand cmd = new FbCommand("NEW_PROCEDURE", cn, tran);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
tran.Commit();
}
catch
{
tran.Rollback();
}
cn.Close();
Console.ReadKey();
пока прога ждет нажатие кнопки - процу обновить нельзя, как тока процесс завершается - все ок. есть подозрение что, где-то внутри FirebirdClient создают отдельную транзакцию для доступа к служебным таблицам и забывают ее коммитить.[/code]
Добавлено: 21 авг 2007, 11:24
WildSery
Dreamer писал(а):хм, если транзакцию закоммители, а соединение закрыли то наверно проца должна считаться уже не используемой ?
А в следующий раз она уже не нужна, нужна другая?
Зачем тогда процедура?
Добавлено: 21 авг 2007, 12:31
Dreamer
WildSery писал(а):А в следующий раз она уже не нужна, нужна другая?
Зачем тогда процедура?
это, так-то процесс разработки и тестирования идет паралелльно, в процах попадаются баги либо нужны какие-то модификации - и их приходится изменять, перезагружать каждый раз IIS, а то и саму базу, что бы завершить какую-то непонятную транзакцию утомляет.
Добавлено: 21 авг 2007, 12:53
WildSery
Dreamer писал(а):перезагружать каждый раз IIS, а то и саму базу, что бы завершить какую-то непонятную транзакцию утомляет.
А то, что у тебя один клиент работает со старой процедурой, второй уже с новой - пофиг?
Где-то валялся клип, с рекламой IT-компании, они там на лету самолёт собирали...
Добавлено: 21 авг 2007, 13:42
Dreamer
WildSery писал(а):А то, что у тебя один клиент работает со старой процедурой, второй уже с новой - пофиг?
ты бы посмотрел вначале код, который я привел парой постов выше. я ведь не жалуюсь, что firebird запретит переливку процы которая юзается в незакомиченной транзакции, речь-то про то, что невозможно перелить даже когда все использующие транзакции завершены, а сам процесс еще нет.
Добавлено: 21 авг 2007, 14:16
kdv
даже когда все использующие транзакции завершены, а сам процесс еще нет.
транзакции тут ни при чем. вопрос в "открытости" коннекта, в котором вызывалась конкретная процедура. Кроме того, драйвер может самостоятельно удерживать коннект открытым некоторое время, чтобы не закрывать-открывать его лишний раз - это зависит от архитектуры драйвера и его настроек.
Добавлено: 21 авг 2007, 14:18
Merlin
В 2.1 вроде устаканилось, или я что-то путаю?
Добавлено: 21 авг 2007, 14:44
Dreamer
Merlin писал(а):В 2.1 вроде устаканилось, или я что-то путаю?
2.1 - это про версию драйвера или самой субд ?
Добавлено: 21 авг 2007, 14:47
Merlin
СУБД. До 2.0 было традиционное поведение, описанное в доке по IB. В 2.0 это дело ужесточили. Склероз мне шепчет, что в 2.1 ещё поборолись с кешем метаданных и вернули статус-кво.
Добавлено: 21 авг 2007, 15:08
WildSery
Dreamer писал(а):речь-то про то, что невозможно перелить даже когда все использующие транзакции завершены, а сам процесс еще нет.
Есть ещё кэш метаданных. И пока ты от базы не отключишься, из другого коннекта хоть все процедуры поменяй - этот коннект будет работать по-старому.
Вроде так.
Добавлено: 21 авг 2007, 17:10
Dreamer
Всем спасибо, проблема решена использованием опции "Pooling=false" в строке подключения т е по умолчанию драйвер юзал пул коннектов, а сл-но не закрывал их несмотря на явный Close().
Добавлено: 21 авг 2007, 17:43
kdv
"Pooling=false"
вот. я даже из Волгограда, при жаре в 38, еще могу
