Непонятная сиутация при конкурентном апдейте

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

Модератор: kdv

Ответить
v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Непонятная сиутация при конкурентном апдейте

Сообщение v6y » 04 окт 2006, 12:52

Привет всем.
Я использую freeradius 1.0.5 как аккаунтинговый сервер. Аккаунтинговая информация хранится в фаябирдовской базе данных (FB 1.5.2, Linux). Доступ к базе осуществляется или через odbc (sql-драйвер rlm_sql_unixodbc, odbc драйвер взят здесь:
http://prdownloads.sourceforge.net/fire ... .69.tar.gz),
или напрямую через API (sql-драйвер rlm_sql_firebird, самописный).

Не могу понять следующую ситуацию:

После заливки нового IOS-а cisco стала слать одновременно два ALIVE пакета. В первом пакете аттрибут Framed-IP-Address равен пустой строке, во втором IP адресу полученному от радиуса. Соответственно имеем одновременный апдейтит одной и той же записи в разных транзакциях. При доступе к БД через odbc эта ситуация почти всегда успешно разрешается, а в случае прямого доступа (через API) где-то в 90% случаев получаю deadlock. При этом, судя по всему(беглый просмотр сырцов odbc-драйвера), уровень изоляции транзакций в обоих случаях (и при использование API, и при использовании odbc) одинаков:

isc_tpb_version3
isc_tpb_wait
isc_tpb_write
isc_tpb_read_committed
isc_tpb_no_rec_version

Проблема не критична(так как в случае ошибки пакет через несколько секунд пересылается вновь), но слегка действует на нервы. Кто-нибудь может дать объяснение или высказать предположение почему odbc почти всегда разруливает это дело, а прямой доступ к БД - нет (уж очень не хочется ковырять сырцы odbc-драйвера и freeradius-а)?

P.S. Гипотеза о "кривых руках" выдвинута в первую очередь и проверяется до сих пор, но пока не находит подтверждения, хотя и помогла выявить некоторые глюки ;-)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 04 окт 2006, 13:02

Использовать no_rec_version - верный способ получить деадлок.

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 04 окт 2006, 13:16

Dimitry Sibiryakov писал(а):Использовать no_rec_version - верный способ получить деадлок.
Я проверял раньше, сейчас проверил еще раз и согласно моим опытам, верный способ получить deadlock это использование rec_version. Проверь тоже, если не трудно плиз.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 04 окт 2006, 13:22

А мне не на чем проверять - нет задач которые бы апдейтили одну запись одновременно.

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 04 окт 2006, 14:02

Dimitry Sibiryakov писал(а):А мне не на чем проверять - нет задач которые бы апдейтили одну запись одновременно.
Тогда откуда такая уверенность насчет no_rec_version? Я конечно легко могу ошибаться, но как показывает мой опыт rec_no_version чуть ли не единственный способ попытаться избежать дедлока при конкурентном апдейте.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 04 окт 2006, 14:37

Есть тут один источник... По имени Энн. И фамилии Гаррисон. Обычно надежный.

Andrew Sagulin
Сообщения: 53
Зарегистрирован: 11 мар 2005, 15:44

Сообщение Andrew Sagulin » 04 окт 2006, 14:56

А вот ещё один источник

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

Сообщение kdv » 04 окт 2006, 15:05

а почему isc_tpb_version3 ? зачем ты ее вообще в tpb указываешь в IBX?

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

Сообщение Merlin » 04 окт 2006, 15:08

Andrew Sagulin писал(а):А вот ещё один источник
Лажа, иззиняюсь. Для двух транзакций - да, больше - стохастически.

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 04 окт 2006, 15:14

kdv писал(а):а почему isc_tpb_version3 ? зачем ты ее вообще в tpb указываешь в IBX?
Дмитрий, какой IBX, прости господи??????

2Merlin
Ну ты ж чуть ли не самый умный, может у тебя какие идеи есть? ;-) Почему odbc не дедлочит?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 окт 2006, 15:30

v6y писал(а):Почему odbc не дедлочит?
Потому что не делает это одновременно ?

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 04 окт 2006, 16:13

hvlad писал(а):
v6y писал(а):Почему odbc не дедлочит?
Потому что не делает это одновременно ?
Думал я об этом... Система у freeradius-а такая, что каждый accounting-request (в зависимости от используемого sql-драйвера) обрабатывается отдельным подключеним либо к базе, либо к odbc-источнику. Но тогда, как мне кажетя, odbc должен либо быть слишком тормозным (или слишком быстрым :shock: ), либо у него должно быть что то наподобие очереди запросов - типа выполнил, закомиттил. В любом случае что бы выяснить нужно odbc-шные сырцы копать, а мне этого делать ну очень не хочется.

Ответить