| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 для выгрузки данных и все... |
| Автор: beroal 27.4.2010, 18:47 | ||
Это особенность транзакций. Если первая программа не закрыла транзакцию, значит она планирует и дальше работать с БД и другие программы ей будут мешать. В вашем случае этот конфликт разрешается с помощью блокировки. Если проблема возникает только при использовании IBExpert, то надо просто откатывать транзакцию в IBExpert. |
| Автор: Akella 27.4.2010, 23:34 |
| Ты сначала расскажи нам, какие параметры транзакций у тебя указаны в эксперте и у тебя в программе, если, конечно, ты там хоть-что-то указывал. |
| Автор: Deniz 28.4.2010, 05:56 | ||
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 | ||||||
Проверила. Все работает! 2 IB Experta выполняют один и те же запросы не блокируя друг друга! Добавлено через 3 минуты и 1 секунду
Никаких настроек транзакций в IB Experte не производила, самое интересное то, что программа написанная на дельфи много лет назад работает как часы и клала она на IB Expert и его транзакции... Может быть мне в моей программе надо в настройках подключения указывать игнор транзакций или еще что в этом роде? |
| Автор: former 28.4.2010, 07:43 | ||
А ведь я про это говорил с самого начала. Необходимо в программе (твоей) настроить транзакции. Ссылки по работе с транзакциями уже даны выше. |
| Автор: Wardena 28.4.2010, 08:57 | ||||
В моей программе вообще транзакции не используются, то есть мне нужно их ввести, так что ли? |
| Автор: former 28.4.2010, 09:25 | ||
В программе может и не используются, а вот библиотека, через которую осуществляется доступ наверняка. Может в доках к ней есть что-нибудь про работу с транзакциями? |
| Автор: Akella 28.4.2010, 10:57 | ||
Так вот нужно настроить. Используются по любому. Неявно. Wardena, какой способ (компоненты) доступа используешь? |
| Автор: Deniz 28.4.2010, 11:12 | ||||
см. первый пост.
Вот примерный вариант работы.
Добавлено через 2 минуты Wardena, приведи код твоей программы, где запрос виснет. |
| Автор: Akella 28.4.2010, 11:38 |
О! А то по-умолчанию, на сколько я знаю, там др. параметры. |
| Автор: Wardena 21.5.2010, 13:04 |
| Deniz, !!!!!!! СПАСИБО !!!!!!!!!! Я уже было отчаялась! csb.IsolationLevel = IsolationLevel.ReadUncommitted; То есть незакомиченные тоже читать! И все! |
| Автор: beroal 21.5.2010, 13:22 | ||||
В оригинальном посте описано зависание при обращении к БД, следовательно, блокировка происходит. Добавлено через 4 минуты и 8 секунд
Я подразумевал наивысший уровень изоляции транзакций (забыл, как он называется, serializable, что ли). Вы, к сожалению, посоветовали человеку читать грязные данные (пользуясь тем, что он не понимает, что это может привести к трудно обнаружимым ошибкам и странным результатам). |
| Автор: Akella 21.5.2010, 16:58 |
| А кто ему мешает почитать и разораться в транзакциях, что бы понимать? |
| Автор: Deniz 19.7.2010, 11:22 |
| Нет такого понятия "высший" или "низший" уровень изоляции. Это где я такое советовал? В моем варианте было ReadCommited, а уже Wardena захотела ReadUncommitted. Ну что же, флаг в руки, до первых граблей. Добавлено через 7 минут и 58 секунд А почему же тогда блокировки нет, если запустить 2 IBExpert'а? |
| Автор: beroal 20.7.2010, 13:33 | ||
Его легко ввести, так как уровни изоляции действительно упорядочены. Наивысший = наибольший. P.S. Никто не подскажет, почему уведомления мне приходят через месяц? |
| Автор: Deniz 20.7.2010, 14:15 | ||
Так же интересно, какой же уровень можно поставить выше Read Committed или Repeatable Read, и в чем заключается критерий "высоты"? |