Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Блокировка выборки данных незакрытой транзакцией


Автор: Wardena 27.4.2010, 09:36
При работе с базой данных firebird 2.1.3 из VisualStudio посредством FirebirdSql.Data.FirebirdClient.dll была обнаружена странная закономерность. Иногда при выполнении запроса на выборку большого объема данных программа впадает в ступор. Спустя месяц я кажется поняла что к нему приводит... Незакрытая транзация. Для примера, я совершаю какую-то выборку данных в IB Expert и оставляю его открытым, не выполняя Commit. Пытаюсь выполнить Select из программы - ступор, причем как только закрываю транзакцию в IB Expert, то запрос тут же выполняется, выходя из ступора.

Это такая особенность firebird-а или как? К рассматриваемой базе подключатся из программ написанных давным давно какими-то школьниками на Delphi и видимо там не совсем продумано закрытие транзаций. Как быть? почему собственного Delphi пофиг на эти нюансы, а из VisualStudio не работает?

Автор: former 27.4.2010, 10:54
Wardena, очевидно, что транзакции в программе выполняют блокировку записи. Разберитесь с http://www.citforum.ru/database/interbase/oledb/part1.shtml.

Автор: Wardena 27.4.2010, 11:27
Транзакции в какой программе? IB Expert? я не понимаю на какой стороне мне разбираться, мне нужно поднастроить сервер firebird? или мне нужно поднастроить настройки подключения? или еще что? У меня в программе вообще транзакции не используются, у меня примется обычный метод FbDataAdapter.Fill для выгрузки данных и все...

Автор: Deniz 27.4.2010, 13:13
Wardena, запусти две версии IBExpert'а.
В первом
Цитата(Wardena @  27.4.2010,  11:36 Найти цитируемый пост)
Для примера, я совершаю какую-то выборку данных в IB Expert и оставляю его открытым, не выполняя Commit.

Во втором тот select из прошраммы
Цитата(Wardena @  27.4.2010,  11:36 Найти цитируемый пост)
Пытаюсь выполнить Select из программы - ступор

Результат опиши здесь.

Автор: beroal 27.4.2010, 18:47
Цитата(Wardena @ 27.4.2010,  06:36)
Незакрытая транзация. Для примера, я совершаю какую-то выборку данных в IB Expert и оставляю его открытым, не выполняя Commit. Пытаюсь выполнить Select из программы - ступор, причем как только закрываю транзакцию в IB Expert, то запрос тут же выполняется, выходя из ступора.

Это такая особенность firebird-а или как?

Это особенность транзакций. Если первая программа не закрыла транзакцию, значит она планирует и дальше работать с БД и другие программы ей будут мешать. В вашем случае этот конфликт разрешается с помощью блокировки.

Если проблема возникает только при использовании IBExpert, то надо просто откатывать транзакцию в IBExpert.

Автор: Akella 27.4.2010, 23:34
Ты сначала расскажи нам, какие параметры транзакций у тебя указаны в эксперте и у тебя в программе, если, конечно, ты там хоть-что-то указывал.

Автор: Deniz 28.4.2010, 05:56
Цитата(beroal @  27.4.2010,  20:47 Найти цитируемый пост)
Это особенность транзакций. Если первая программа не закрыла транзакцию, значит она планирует и дальше работать с БД и другие программы ей будут мешать.
Это откуда такое заключение?
Цитата(beroal @  27.4.2010,  20:47 Найти цитируемый пост)
В вашем случае этот конфликт разрешается с помощью блокировки.
FireBird версионник, а не блокировочник, и чтобы сделать блокировку записи, нужно еще постараться, например http://www.ibase.ru/devinfo/pslock.htm

Автор: Deniz 28.4.2010, 06:49
Wardena, почитай статьи на http://www.ibase.ru особенно про транзакции

Автор: Wardena 28.4.2010, 06:52
Цитата(Deniz @ 27.4.2010,  13:13)
Wardena, запусти две версии IBExpert'а.
В первом
Цитата(Wardena @  27.4.2010,  11:36 Найти цитируемый пост)
Для примера, я совершаю какую-то выборку данных в IB Expert и оставляю его открытым, не выполняя Commit.

Во втором тот select из прошраммы
Цитата(Wardena @  27.4.2010,  11:36 Найти цитируемый пост)
Пытаюсь выполнить Select из программы - ступор

Результат опиши здесь.

Проверила. Все работает! 2 IB Experta выполняют один и те же запросы не блокируя друг друга!

Добавлено через 3 минуты и 1 секунду
Цитата(Akella @ 27.4.2010,  23:34)
Ты сначала расскажи нам, какие параметры транзакций у тебя указаны в эксперте и у тебя в программе, если, конечно, ты там хоть-что-то указывал.

Никаких настроек транзакций в IB Experte не производила, самое интересное то, что программа написанная на дельфи много лет назад работает как часы и клала она на IB Expert и его транзакции... Может быть мне в моей программе надо в настройках подключения указывать игнор транзакций или еще что в этом роде?

Автор: former 28.4.2010, 07:43
Цитата(Wardena @  28.4.2010,  06:52 Найти цитируемый пост)
Может быть мне в моей программе надо в настройках подключения указывать игнор транзакций или еще что в этом роде? 

А ведь я про это говорил с самого начала. Необходимо в программе (твоей) настроить транзакции. Ссылки по работе с транзакциями уже даны выше.

Автор: Wardena 28.4.2010, 08:57
Цитата(former @ 28.4.2010,  07:43)
Цитата(Wardena @  28.4.2010,  06:52 Найти цитируемый пост)
Может быть мне в моей программе надо в настройках подключения указывать игнор транзакций или еще что в этом роде? 

А ведь я про это говорил с самого начала. Необходимо в программе (твоей) настроить транзакции. Ссылки по работе с транзакциями уже даны выше.

В моей программе вообще транзакции не используются, то есть мне нужно их ввести, так что ли?

Автор: former 28.4.2010, 09:25
Цитата(Wardena @  28.4.2010,  08:57 Найти цитируемый пост)
В моей программе вообще транзакции не используются, то есть мне нужно их ввести, так что ли? 

В программе может и не используются, а вот библиотека, через которую осуществляется доступ наверняка. Может в доках к ней есть что-нибудь про работу с транзакциями?

Автор: Akella 28.4.2010, 10:57
Цитата(Wardena @  28.4.2010,  06:52 Найти цитируемый пост)
Никаких настроек транзакций в IB Experte не производила, самое интересное то, что программа написанная на дельфи много лет назад работает как часы и клала она на IB Expert и его транзакции... Может быть мне в моей программе надо в настройках подключения указывать игнор транзакций или еще что в этом роде? 

Так вот нужно настроить. 

Цитата(former @  28.4.2010,  09:25 Найти цитируемый пост)
В программе может и не используются,

Используются по любому. Неявно.

Wardena, какой способ (компоненты) доступа используешь?

Автор: Deniz 28.4.2010, 11:12
Цитата(Akella @  28.4.2010,  12:57 Найти цитируемый пост)
Wardena, какой способ (компоненты) доступа используешь?
см. первый пост.
Цитата(Wardena @  27.4.2010,  11:36 Найти цитируемый пост)
При работе с базой данных firebird 2.1.3 из VisualStudio посредством FirebirdSql.Data.FirebirdClient.dll была обнаружена странная закономерность.

Вот примерный вариант работы.
Код
Dim csb As New FirebirdClient.FbConnectionStringBuilder
csb.Charset = "win1251"
csb.ClientLibrary = ClientDLL

csb.Database = "c:\base.fdb"
csb.DataSource = "localhost"
csb.Dialect = 3
csb.IsolationLevel = Data.IsolationLevel.ReadCommitted
csb.UserID = "SYSDBA"
csb.Password = "masterkey"
csb.ServerType = FirebirdClient.FbServerType.Default

Dim cn As FirebirdClient.FbConnection
cn = New FirebirdClient.FbConnection(csb.ToString)

cn.Open()
...
cn.Close()
обрати внимание на csb.IsolationLevel = Data.IsolationLevel.ReadCommitted

Добавлено через 2 минуты
Wardena, приведи код твоей программы, где запрос виснет.

Автор: Akella 28.4.2010, 11:38
Цитата(Deniz @  28.4.2010,  11:12 Найти цитируемый пост)
csb.IsolationLevel = Data.IsolationLevel.ReadCommitted

О!
А то по-умолчанию, на сколько я знаю, там др. параметры.

Автор: Wardena 21.5.2010, 13:04
Deniz, !!!!!!! СПАСИБО !!!!!!!!!!
Я уже было отчаялась! 

csb.IsolationLevel = IsolationLevel.ReadUncommitted;

То есть незакомиченные тоже читать! И все!

Автор: beroal 21.5.2010, 13:22
Цитата(Deniz @ 28.4.2010,  02:56)
Цитата(beroal @  27.4.2010,  20:47 Найти цитируемый пост)
В вашем случае этот конфликт разрешается с помощью блокировки.
FireBird версионник, а не блокировочник, и чтобы сделать блокировку записи, нужно еще постараться, например http://www.ibase.ru/devinfo/pslock.htm

В оригинальном посте описано зависание при обращении к БД, следовательно, блокировка происходит.

Добавлено через 4 минуты и 8 секунд
Цитата(Deniz @ 28.4.2010,  02:56)
Цитата(beroal @  27.4.2010,  20:47 Найти цитируемый пост)
Это особенность транзакций. Если первая программа не закрыла транзакцию, значит она планирует и дальше работать с БД и другие программы ей будут мешать.
Это откуда такое заключение?

Я подразумевал наивысший уровень изоляции транзакций (забыл, как он называется, serializable, что ли). Вы, к сожалению, посоветовали человеку читать грязные данные (пользуясь тем, что он не понимает, что это может привести к трудно обнаружимым ошибкам и странным результатам).

Автор: Akella 21.5.2010, 16:58
А кто ему мешает почитать и разораться в транзакциях, что бы понимать?

Автор: Deniz 19.7.2010, 11:22
Цитата(beroal @  21.5.2010,  15:22 Найти цитируемый пост)
Я подразумевал наивысший уровень изоляции транзакций
Нет такого понятия "высший" или "низший" уровень изоляции.
Цитата(beroal @  21.5.2010,  15:22 Найти цитируемый пост)
Вы, к сожалению, посоветовали человеку читать грязные данные
Это где я такое советовал?
В моем варианте было ReadCommited, а уже Wardena захотела ReadUncommitted. Ну что же, флаг в руки, до первых граблей.

Добавлено через 7 минут и 58 секунд
Цитата(beroal @  21.5.2010,  15:22 Найти цитируемый пост)
В оригинальном посте описано зависание при обращении к БД, следовательно, блокировка происходит.
А почему же тогда блокировки нет, если запустить 2 IBExpert'а?
Цитата(Wardena @  28.4.2010,  08:52 Найти цитируемый пост)
Проверила. Все работает! 2 IB Experta выполняют один и те же запросы не блокируя друг друга!

Автор: beroal 20.7.2010, 13:33
Цитата(Deniz @ 19.7.2010,  08:22)
Цитата(beroal @  21.5.2010,  15:22 Найти цитируемый пост)
Я подразумевал наивысший уровень изоляции транзакций
Нет такого понятия "высший" или "низший" уровень изоляции.

Его легко ввести, так как уровни изоляции действительно упорядочены. Наивысший = наибольший.
P.S. Никто не подскажет, почему уведомления мне приходят через месяц?

Автор: Deniz 20.7.2010, 14:15
Цитата(beroal @  20.7.2010,  15:33 Найти цитируемый пост)
Его легко ввести, так как уровни изоляции действительно упорядочены. Наивысший = наибольший.
Не надо ничего вводить, есть определенная http://www.ibase.ru/devinfo/ibtrans.htm.
Так же интересно, какой же уровень можно поставить выше Read Committed или Repeatable Read, и в чем заключается критерий "высоты"?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)