Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2013, 18:46   #1
Moneo
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 37
По умолчанию Динамические имена транзакций

Делаю приложение базы данных с мультидоступом, все транзакции имеют свойства:
read_committed
rec_version
nowait
Но выкидывает deadblock с 2 компьютера, если одновременно заходить.
Решил не париться и попробовать сделать генерируемые имена транзакций чтоб они друг на друга не натыкались. Но делфи ругается:

Типы:
rtrans:string;
newname:string;

Код:

for i:=1 to n do rtrans:=rtrans+Char(byte('A')+rando m(2)*32+random(26));
ibtransaction1.Name:='Transaction'+ rtrans;
newname:='Transaction'+rtrans;
newname.StartTransaction; // в этой строке на неизвестный идентификатор

P.S: помогите может можно проще deadblock решить
Moneo вне форума Ответить с цитированием
Старый 09.06.2013, 19:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но делфи ругается:
Еще один любитель телепатии?
Садись в позу увядшего лотоса - будем твой моск сканировать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2013, 20:20   #3
Moneo
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Еще один любитель телепатии?
Садись в позу увядшего лотоса - будем твой моск сканировать.
я вообще-то дальше написал на что ругается, будьте внимательнее.
Moneo вне форума Ответить с цитированием
Старый 09.06.2013, 20:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
дальше написал на что ругается,
Угу. Конечно. Заметно. Где же мои глаза были...
Знач по теме
Во-первых: ibtransaction1.Name:='Transaction'+ rtrans; это не имя транзакции. Это всего лишь имя компонента.
Во-вторых: дедлок получается только при определенных условиях, по факту не особо зависящих от Делфи, или в чем ты работаешь.
Нужно знать какие запросы и куда идут в этих транзакциях.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2013, 21:56   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

динамические имена тебя на спасут.
Цитата:
Код:
newname.StartTransaction; // в этой строке на неизвестный идентификатор
при
Цитата:
Код:
newname:string;
и я бы ругался).
а какой смысл с двух разных компов заходить в одну и ту же запись?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 09.06.2013, 23:21   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а какой смысл с двух разных компов заходить в одну и ту же запись?
Смысл то допустим есть еще какой, но вот дедлок получить не так просто как кажется. Для этого нужно очень сильно провтыкать с запросами.
Я поэтому и хочу узнать подробности от автора темы.
Хотя если автор правильно пишет коммит транзакции, как Юра заметил без старта ее, то IB мог бы на это реагировать неадекватно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2013, 00:55   #7
Moneo
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 37
По умолчанию

Отказался я от динамических транзакций и стал пытаться разобраться с ними.
Вот код 2 форм:
1Форма: http://rghost.ru/private/46639194/c8...e13f88ba28ec1b

2Форма:
http://rghost.ru/private/46639201/b6...9b5f3f9a048fde

Щас вообще стер все что писал про транзакции ибо не получается ничего то deadblock, то где-то выскакивает transaction active, not active хотя по коду все норм.

Посмотрите пожалуйста. Вот инфа о самих транзакциях:
AllowAutoStart:=true;
read_committed
rec_version
nowait

1форма - ibtable1 - ibtransaction1, ibquery1 - ibtransaction1
2форма - ibtable1 - ibtransaction1, ibtable2 - ibtransaction2, ibtable3 - ibtransaction3, ibquery1 - ibtransaction4, ibquery2 - ibtransaction3

P.S: обновление записей происходит только в таблицах (compared_table) и ('TABLE'+inttostr(exet));
Код:
ibtable1.TableName:='TABLE'+inttostr(exet);
ibtable1.FieldDefs.clear;
ibtable1.FieldDefs.add('FLP',ftblob,0,false);
ibtable1.FieldDefs.Add('GROUP',ftblob,0,false);
ibtable1.FieldDefs.add('NAME TEST',ftblob,0,false);
ibtable1.FieldDefs.Add('QUESTIONS_COUNT',ftinteger,0,false);
ibtable1.FieldDefs.Add('ANSWERS_COUNT',ftinteger,0,false);
ibtable1.FieldDefs.add('TRUE_ANSWERS_COUNT',ftinteger,0,false);
ibtable1.FieldDefs.Add('FALSE_ANSWERS_COUNT',ftinteger,0,false);
ibtable1.FieldDefs.Add('LIST_TRUE_ANSWERS',ftblob,0,false);
ibtable1.FieldDefs.Add('LIST_FALSE_ANSWERS',ftblob,0,false);
ibtable1.FieldDefs.Add('TRUE_QUESTIONS',ftinteger,0,false);
ibtable1.FieldDefs.Add('RATING',ftinteger,0,false);

Последний раз редактировалось Moneo; 10.06.2013 в 01:01.
Moneo вне форума Ответить с цитированием
Старый 10.06.2013, 07:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ibtable1 - ibtransaction1
Вау... А вот тут я бы застрял.
Никогда не знал что с Table можно использовать транзакции.
Просто предположу - дедлок возникает, если записи на выборку или запись недоступны. Table по своей сути блокирует всю таблицу.
Вывод - либо пользоваться query либо поискать среди свойств Table что-то что работает с кэшированием. Сам я его никогда не использовал, но слышал о такой возможности.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2013, 09:16   #9
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

альтернатива: попробовать IBDataSet
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 10.06.2013, 13:00   #10
Moneo
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 37
По умолчанию

Сегодня стер все транзакции и оставил только commit где данные обновляются и воспроизвел ситуацию вчерашнего дэдблока и вуаля сегодня все хорошо работает. В чем может быть проблема?
Moneo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические имена varyat SQL, базы данных 3 31.08.2011 11:52
лог транзакций ФБ alex_-87 БД в Delphi 7 13.07.2010 14:09
Построение графа транзакций. Alex_sim Общие вопросы .NET 7 29.04.2010 21:58
закрытие транзакций ancia Lazarus, Free Pascal, CodeTyphon 3 11.03.2010 16:12
Что делать, если имена полей динамические? Rock'n'rolla Работа с сетью в Delphi 1 25.01.2010 14:56