.NET FirebirdClient лочатся процедуры

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

Модератор: kdv

Ответить
Dreamer
Сообщения: 10
Зарегистрирован: 20 авг 2007, 21:50

.NET FirebirdClient лочатся процедуры

Сообщение Dreamer » 20 авг 2007, 22:28

история такая: используем из шарповского кода firebird версии 2.0.1 через FirebirdClient ADO 2.0 для вызова хранимых процедур, время от времени стали замечать что ibexpert не может перелить какую либо процу ругаясь на lock conflict. путем эксперемента выяснили что это происходит после того как процедура была выполнена FirebirdClient-ом. причем как с явным так и не явным использованием транзакции. кто нибудь сталкивался с этим ? это баг FirebirdClient ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 авг 2007, 00:40

"перелить"?
именно "lock conflict" ?
у вас прямо во время работы настоятельная потребность альтерить используемые процедуры???

Dreamer
Сообщения: 10
Зарегистрирован: 20 авг 2007, 21:50

Сообщение Dreamer » 21 авг 2007, 10:52

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]

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 авг 2007, 11:24

Dreamer писал(а):хм, если транзакцию закоммители, а соединение закрыли то наверно проца должна считаться уже не используемой ?
А в следующий раз она уже не нужна, нужна другая?
Зачем тогда процедура?

Dreamer
Сообщения: 10
Зарегистрирован: 20 авг 2007, 21:50

Сообщение Dreamer » 21 авг 2007, 12:31

WildSery писал(а):А в следующий раз она уже не нужна, нужна другая?
Зачем тогда процедура?
это, так-то процесс разработки и тестирования идет паралелльно, в процах попадаются баги либо нужны какие-то модификации - и их приходится изменять, перезагружать каждый раз IIS, а то и саму базу, что бы завершить какую-то непонятную транзакцию утомляет.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 авг 2007, 12:53

Dreamer писал(а):перезагружать каждый раз IIS, а то и саму базу, что бы завершить какую-то непонятную транзакцию утомляет.
А то, что у тебя один клиент работает со старой процедурой, второй уже с новой - пофиг?
Где-то валялся клип, с рекламой IT-компании, они там на лету самолёт собирали...

Dreamer
Сообщения: 10
Зарегистрирован: 20 авг 2007, 21:50

Сообщение Dreamer » 21 авг 2007, 13:42

WildSery писал(а):А то, что у тебя один клиент работает со старой процедурой, второй уже с новой - пофиг?
ты бы посмотрел вначале код, который я привел парой постов выше. я ведь не жалуюсь, что firebird запретит переливку процы которая юзается в незакомиченной транзакции, речь-то про то, что невозможно перелить даже когда все использующие транзакции завершены, а сам процесс еще нет.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 авг 2007, 14:16

даже когда все использующие транзакции завершены, а сам процесс еще нет.
транзакции тут ни при чем. вопрос в "открытости" коннекта, в котором вызывалась конкретная процедура. Кроме того, драйвер может самостоятельно удерживать коннект открытым некоторое время, чтобы не закрывать-открывать его лишний раз - это зависит от архитектуры драйвера и его настроек.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 авг 2007, 14:18

В 2.1 вроде устаканилось, или я что-то путаю?

Dreamer
Сообщения: 10
Зарегистрирован: 20 авг 2007, 21:50

Сообщение Dreamer » 21 авг 2007, 14:44

Merlin писал(а):В 2.1 вроде устаканилось, или я что-то путаю?
2.1 - это про версию драйвера или самой субд ?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 авг 2007, 14:47

СУБД. До 2.0 было традиционное поведение, описанное в доке по IB. В 2.0 это дело ужесточили. Склероз мне шепчет, что в 2.1 ещё поборолись с кешем метаданных и вернули статус-кво.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 авг 2007, 15:08

Dreamer писал(а):речь-то про то, что невозможно перелить даже когда все использующие транзакции завершены, а сам процесс еще нет.
Есть ещё кэш метаданных. И пока ты от базы не отключишься, из другого коннекта хоть все процедуры поменяй - этот коннект будет работать по-старому.
Вроде так.

Dreamer
Сообщения: 10
Зарегистрирован: 20 авг 2007, 21:50

Сообщение Dreamer » 21 авг 2007, 17:10

Всем спасибо, проблема решена использованием опции "Pooling=false" в строке подключения т е по умолчанию драйвер юзал пул коннектов, а сл-но не закрывал их несмотря на явный Close().

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 авг 2007, 17:43

"Pooling=false"
вот. я даже из Волгограда, при жаре в 38, еще могу :)

Ответить