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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2012, 09:32   #1
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию транзикция из библиотеки mysql.

есть некая программа которая различными способами собирает данные в таблицу. а потом сохраняет эти данные в mySQL 5.5. пока сделано далеко не оптимально, и через библиотеку.

вопрос как объединить эти обновления записей в одну транзикцию. то есть сначала передать на сервер данные а потом попросить его внести изменения в таблицу. таблица innodb.

в таблице может быть от 100 до 1000 записей. (хотя их можно делить как понравиться если необходимо)

Код:
var
  query_result: IMySQLQuery;
  i,j:integer;
  str1,strokB:string;
  s1,s2,s3,s4,s5,s6,S2_t,S2_d:string;
begin
  if db_sql5.BD_new.MySQL.Connected then
  begin
    lInfo.Caption :='';
    j:=0;
    //новая версия с минимум зaпросов.
    for i:=1 to form1.ShowTabl.RowCount-1 do
    if form1.ShowTabl.Cells[9,i]<>'' then
    begin
      s1:=form1.ShowTabl.Cells[2,i];  //(значение)
      s2:=form1.ShowTabl.Cells[10,i]; //(дата время) 
      s3:=form1.ShowTabl.Cells[9,i];  //  (глобальная метка в программе)
      s4:=form1.ShowTabl.Cells[3,i];  //  (код объекта)
      strokB:='UPDATE metr SET `value`= '+s1+', `dateItime`="'+s2+'" WHERE `Slable`="'+s3+'" and IOkod='+s4;
      if not MySQL.ExecSQL(strokB) then //если произошла ошибка в запросе
      begin       //причинами могут быть отсутствие таблицы или некорректный запрос или...
        ShowMySQLError; //посмотрим ошибку
      end
      else
      j:=j+1;
    end;
    kol_par_up.Caption:=inttostr(j);
    lInfo.Caption := lInfo.Caption + 'Получили все записи. ';

  end;
end;
с помощью оболочки MySQL Workbench выглядит так например.
Код:
START TRANSACTION;
UPDATE metr SET `value`=24 WHERE `Slable`='WY_8';
UPDATE metr SET `value`=24 WHERE `Slable`='Yvak_7';
UPDATE metr SET `value`=24 WHERE `Slable`='Yaim_6';
COMMIT;

и ещё вопрос какой параметр можно посмотреть что бы узнать выполнился ли апдейт строки или она не изменилась.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 06.04.2012 в 09:37.
IliaIT вне форума Ответить с цитированием
Старый 06.04.2012, 11:12   #2
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Цитата:
различными способами собирает данные
Не понятно что и откуда берется. Источниками что служит?
Цитата:
пока сделано далеко не оптимально, и через библиотеку
Это вообще о чем? Что вы понимаете под библиотекой?
Цитата:
как объединить эти обновления записей в одну транзикцию
Зачем вам одна транзакция? У вас что то меняется если при обработке какой либо записи все падает, и остальные записи не добавляются?
Это вопрос о понимании того что вы просите.
Цитата:
то есть сначала передать на сервер данные а потом попросить его внести изменения в таблицу
Что вы подразумеваете в этом предложении? Ибо теоретически это можно решать разными способами. А вот практически вам нужен один наиболее оптимально подходящий под вашу задачу.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 06.04.2012, 14:26   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Зачем вам одна транзакция?
rdama, TC хочет записать или все записи, или ни одной. С компонентами для MySQL не знаком, но думаю, что должны быть методы связанные с началом транзакции или коммитом. Допускаю, что эти команды можно и напрямую выполнить через ExecSQL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.04.2012, 15:08   #4
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Ававтар, да я прекрасно понимаю о чем спрашивает ТС. И прекрасно знаю что такое транзакция. Я спросил от том какова необходимость ее использования при вставке
Цитата:
может быть от 100 до 1000 записей
и на что повлияет если часть данных будет вставлена а часть нет. Обычно в транзакции делается вставка/обновление/удаление зависимых друг от друга данных. Т.е. обработка нескольких таблиц имеющих связи между собой. В данном случае я не вижу пока необходимости использовать транзакцию. Так же как и собирать все данные в один набор и потом его крутить. Может быть можно взять данные с разных источников и поочередно их сунуть в БД.
В общем вопросы к ТС и пока он не ответит на них ему сложно помочь. По мне так я просто пока не вижу смысла в транзакции. Или ТС не совсем понимает что это такое.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)

Последний раз редактировалось rdama; 06.04.2012 в 15:10.
rdama вне форума Ответить с цитированием
Старый 06.04.2012, 15:39   #5
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

Цитата:
Не понятно что и откуда берется. Источниками что служит?
источником служат различные сервера (как файловые так и с базами) локальной сети с которых собираются данные в единую таблицу ShowTabl типа стринггрид.
послед сбора информации её необходимо обновить на сервере где стоит mysql5.5.,
полный сбор и подготовка информации происходит где то за 5 минут.
в принципе это всё работает уже.
Цитата:
Это вообще о чем? Что вы понимаете под библиотекой?
тут подразумевается что используются для доступа к базе mysql5.5 возможности libmySQL.dll (на основе MySQL.rar) а не стандартные компоненты дао или похожие.
Цитата:
Зачем вам одна транзакция?
я считаю(чисто моё предположение) что нагрузка на сервер будет меньше если использовать транзикцию (точнее пиковая, не потеряются запросы). хотя при текущей загрузки сервера это в данный момент не критично.

так немного структуре базы.
данные таблицы между собой независимы.
в данный момент у этой таблицы нет зависимых таблиц.

на текущий момент программа обновления записей со своей задачей справляется. (правда там сейчас к базе подключено 2 клиента на чтение этих параметров (все 1000 за раз, запрос SELECT), в плане до 100 клиентов(пользователей) единовременно). Опять же в пользу транзикции попадалась статья на просторах и нтернета, что можно переполнить буфер базы и последующие запросы будут отсекаться. такое возможно при совпадении времени обновления данных моей программой и программы клиента(пользователя).


может я не правельно понимаю суть транзикции и может она позволяет просто откатить данные в отличии от апдейта, а распределение времени обработки запросов будет такое же.
Вложения
Тип файла: rar MySQL.rar (598.9 Кб, 12 просмотров)
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 06.04.2012 в 15:42.
IliaIT вне форума Ответить с цитированием
Старый 07.04.2012, 05:24   #6
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Ну тут хочу тебе открыть тайну все общаются с MySQL по средством libmySQL.dll. Иначе не бывает. Это библиотека реализующая доступ к нему. Просто разный подход к ней используется у разных компонентов.
Почему нельзя лить данные из разных БД сразу напрямую? Зачем используется интерфейс?
Транзакционность в вашем случае не нужна а скорее совсем не нужна.
ПО переполнению, настрайвайте сервер СУБД. Там файлик есть my.ini.
Каким образом определяется что данные полученные из источника уже есть в приемнике?
Просто по факту можно нарисовать службу которая будет так же обходить и закидывать данные. Можно нарисовать консольное приложение и настроить шедулер. Вариантов много. Сам мускуль заставить лазить и брать не получится.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 09.04.2012, 08:27   #7
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

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

осталось понять ка настроить правильно, но тут буду копать мануалы и инет.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 09.04.2012, 10:25   #8
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Цитата:
графический интерфейс необходим для контроля получаемой информации (при необходимости) для визуального контроля другими сотрудниками (это было их требование).
Явный бред. Причем я уверен что никто ничего не контролирует. По простой причине если там 100 записей их может и прокручивают скролом. Если 500 уже сомнения ну может смотрят первые 5 и последние 6. А в 1000 уже никто не смотрит. Т.к. в принципе обработать человек такой объем информации не в состоянии. Максимум это около 250 записей (для супермена который убил человека паука). А все остальное это одно черное пятно.
Так что графический интерфейс нафиг не нужен. Только тормоза и задержки при обработке. Все равно проблемы при повторах или отсутствии будет решать прогер.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
статья - Работа с MySQL в С++ с использованием библиотеки mysql++ Pblog Обсуждение статей 1 24.07.2013 19:28
Зависимость библиотеки от библиотеки ds.Dante C# (си шарп) 2 07.07.2011 12:55
Работа с MySQL в С++ с использованием библиотеки mysql++ oleg kutkov Visual C++ 5 30.12.2010 16:40
обновление в блоге - Работа с MySQL в С++ с использованием библиотеки mysql++ Pblog Обсуждение статей 0 16.08.2009 16:00