powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос не видит изменения данных таблицы
20 сообщений из 20, страница 1 из 1
Запрос не видит изменения данных таблицы
    #39694593
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Столкнулся почти с той же проблемой что описана тут .
На HTTP сервер приходит два запроса, почти одновременно (даже секунды совпадают), один post запрос, который обрабатывает данные и заполняет таблицу, второй get запрос, который по результатам выборки из таблицы, выдает информацию.
Второй запрос (get) выбирает данные из таблицы которую изменил первый (post) и не видит изменений. только если я сделаю обновление страницы, тогда все ОК, и видны измененные данные.

Попробовал установить параметры транзакции как в той теме, т.е. для записи
Код: php
1.
$tr=ibase_trans(IBASE_CONCURRENCY | IBASE_NOWAIT, self::$connection);


и для читающей
Код: php
1.
IBASE_READ || IBASE_COMMITTED || IBASE_REC_VERSION || IBASE_NOWAIT



Все равно нет изменений, пока не сделаешь обновление страницы.
поставил IBExpert, последить за транзакциями, думал зависают - все ОК.
сделал цикл ожидания при обработке get запроса
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
$b->Load($Id); //загрузка данных из БД
$i=10;
While (($i>0) &&($b->STATUS=='A'))
{
  $i=$i-1;
  sleep(1);
 $b->Load($id);
}
....


не помогает, все равно значение не изменяется, ставил $i=60, чтобы успеть сделать выборку в другой программе и посмотреть состояние поля записи. Поле изменено, все ОК, но при обработке get запроса, оно остается в старом состоянии.
только после обновления страницы все ОК и поле меняет значение. Добавлял в цикл ожидания,перед выборкой, реконект к базе, т.е. закрывал соединение и открывал снова
Код: php
1.
2.
3.
 ibase_close(firebird::$connection);
 firebird::Connect(); 
 $b->Load($id);


Результат - 0, т.е. поле не измено, хотя как я писал выше, в другой программе делаю выборку и вижу прекрасно, что поле измено.
Попробовал сделать редирект при обработке get запроса (после обновления же изменения видны) - результат 0, т.е. тоже нет изменений.

Помогите, целый день убил на эту проблему, уже не знаю куда копать. Транзакции и так и так пробовал :(
Может что не так с версией PHP или ОС?
Использую OpenSuse 42.3 и PHP 5.5.14, firebird 2.5
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694597
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

по приведённому тексту не видно где ты стартуешь и завершаешь транзакцию.
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694654
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
использую вот такую функцию для записи значения в таблицу
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public static function execsql($query,$param=null)
       {
           if (!self::IsConnected()) {self::Connect(); }           
           if (self::IsConnected()) 
           {
               $tr=ibase_trans(IBASE_CONCURRENCY | IBASE_NOWAIT,self::$connection);
               $res=ibase_prepare(self::$connection,$tr,$query);
               if ($param<>null)
               {
                 if (!is_array($param))
                      {
                        $ret=ibase_execute($res, $param);   
                      }
                 else
                   {
                       array_unshift($param, $res); 
                       $ret = call_user_func_array('ibase_execute', $param);
                   }        
               }
               else
                 $ret=ibase_execute($res);
               ibase_commit($tr);
               return $ret;
           }
           else
           {
               return -1;
           }
       } 



вот так вот вызываю

Код: php
1.
$res=firebird::execsql("update Accure t set t.Status='F' where t.id=".$this->ID);



если сделаю выборку, сразу после этого изменения, то прекрасно вижу что поле стало 'F',
в параллельно обрабатываемом запросе значение не меняется, пока не сделаешь рефреш страницы
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694656
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот такая функция для выборки
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public static function sql($query,$param=null) 
        {
     
            if (!self::IsConnected()) {self::Connect(); }
            if (self::IsConnected())
             {
                 $tr=ibase_trans(IBASE_WRITE | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT,self::$connection);
                 if ($param==null)
                  {
                     self::$last_result_query = ibase_query(self::$connection,$query) ;
                  }
                 else
                  {
                        if (!is_array($param))
                        {
                            self::$last_result_query=ibase_query(self::$connection,$query,$param);   
                        }
                        else
                        {
                            array_unshift($param, self::$connection, $query); 
                            self::$last_result_query = call_user_func_array('ibase_query', $param);
                        }                          
                  }    
                 if(!self::$last_result_query) 
                  {
                    die("oops, Database query failed: ".ibase_errmsg());
                  }
                ibase_commit($tr);  
                return self::$last_result_query ;
             }
            else
             {
                 return 0;
             }    
        }



с параметрами транзакции "игрался" и так и так, не видит изменения в паралельном запросе, хоть стреляй, пока не сделаешь рефреш.
даже делал реконнекты к базе, в цикле ожидания - бесполезно. Только рефреш помогает.
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694661
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenestи для читающей
Код: php
1.
IBASE_READ || IBASE_COMMITTED || IBASE_REC_VERSION || IBASE_NOWAIT

7713885
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694682
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

не уверен что ibase_query использует твою транзакцию. По крайней мере места куда в эту функцию можно воткнуть хендл транзакции не видно.

Попробуй заменить на ibase_prepare + ibase_execute
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694692
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

snakenestвот так вот вызываю

Код: sql
1.
$res=firebird::execsql("update Accure t set t.Status='F' where t.id=".$this->ID);



Офигительно, т.е. смастерил функцию поддерживающую параметризованные запросами, а параметрами не пользуемся.

Отката транзакции в случае ошибки нет. Освобождение хендлов транзакции и запроса тоже не наблюдается. Надеемся на то что драйвер всё хорошо сделает за вас?

>> с параметрами транзакции "игрался" и так и так, не видит изменения в паралельном запросе, хоть стреляй, пока не сделаешь

я уже сказал ваша функция выборки использует транзакцию по умолчанию. А она вроде как IBASE_CONCURRENCY, поэтому ты можешь хоть 500 раз перезапустить свой запрос всё одно и то же будет. Старт и коммит транзакции RC идёт в холостую. В этой транзакции ничего не делается.
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694796
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29.08.2018 8:22, hvlad пишет:

> 7713885 < http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&msg=7713885>

us-us!
(как говорит Коваленко)

зы: понапридумывают птичьих языков псевдопрограммирования...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694849
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисsnakenest,

не уверен что ibase_query использует твою транзакцию. По крайней мере места куда в эту функцию можно воткнуть хендл транзакции не видно.

Попробуй заменить на ibase_prepare + ibase_execute

Да, скопировал старый вариант функции. Вот
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
    public static function sql($query,$param=null) 
        {
            
            if (!self::IsConnected()) {self::Connect(); }
            if (self::IsConnected())
             {
                 self::$tr=ibase_trans(IBASE_WRITE |IBASE_COMMITTED |IBASE_REC_VERSION | IBASE_NOWAIT,self::$connection);
                 if ($param==null)
                  {
                     self::$last_result_query = ibase_query(self::$tr,$query) ;
                  }
                 else
                  {
                        if (!is_array($param))
                        {
                            self::$last_result_query=ibase_query(self::$tr,$query,$param);   
                        }
                        else
                        {
                            array_unshift($param, self::$tr, $query); 
                            self::$last_result_query = call_user_func_array('ibase_query', $param);
                        }                          
                  }    
                 if(!self::$last_result_query) 
                  {
                    die("oops, Database query failed: ".ibase_errmsg());
                  }
               
                return self::$last_result_query ;
             }
            else
             {
                 return 0;
             }    
        }




Как видите, транзакция используется во всех вариантах выполнения запроса
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694856
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисsnakenest,

snakenestвот так вот вызываю

Код: sql
1.
$res=firebird::execsql("update Accure t set t.Status='F' where t.id=".$this->ID);



Офигительно, т.е. смастерил функцию поддерживающую параметризованные запросами, а параметрами не пользуемся.

Отката транзакции в случае ошибки нет. Освобождение хендлов транзакции и запроса тоже не наблюдается. Надеемся на то что драйвер всё хорошо сделает за вас?

>> с параметрами транзакции "игрался" и так и так, не видит изменения в паралельном запросе, хоть стреляй, пока не сделаешь

я уже сказал ваша функция выборки использует транзакцию по умолчанию. А она вроде как IBASE_CONCURRENCY, поэтому ты можешь хоть 500 раз перезапустить свой запрос всё одно и то же будет. Старт и коммит транзакции RC идёт в холостую. В этой транзакции ничего не делается.

Я уже и так, и так делал этот вызов, уже подумал, что может из-за параметров запроса, какая-то фигня, т.е. от безисходности уже самые невероятные предположения.
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694859
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenestКак видите, транзакция используется во всех вариантах выполнения запроса

Но при этом она глобальная и никогда не завершается. Прэлеестно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694868
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот то что я использую

Код: php
1.
IBASE_WRITE |IBASE_COMMITTED |IBASE_REC_VERSION | IBASE_NOWAIT



вот описание:

IBASE_WRITE Начинает транзакцию в режиме чтения и записи.
BASE_COMMITTED Начинает транзакцию с уровнем изоляции 'read committed' (читать фиксированое). Этот флаг должен быть объединен с IBASE_REC_VERSION или IBASE_REC_NO_VERSION . Этот уровень изоляции позволяет получить доступ к изменениям, совершеными после начала транзакции. Если указан флаг IBASE_REC_NO_VERSION , только последняя версия изменений может быть прочитана. Если указан флаг IBASE_REC_VERSION , то можно читать изменения, находящиеся в очереди в параллельных транзакциях.
IBASE_NOWAIT Флаг, указывающий, что транзакция должна ждать при возникновении конфликта транзакций.

Т.е. транзакция чтения/записи которая имеет доступ к транзакциям совершенным после старта оной, читает все изменения в параллельных транзакциях, и при возникновении конфликта, выдает ошибку.

Что я делаю не так? ((
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694882
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovsnakenestКак видите, транзакция используется во всех вариантах выполнения запроса

Но при этом она глобальная и никогда не завершается. Прэлеестно...


Код: php
1.
$res=firebird::execsql("update Accure t set t.Status='F' where t.id=".$this->ID);



В рамках выполнения этого запроса, функцией описанной выше "firebird::execsql",
строка
Код: php
1.
  ibase_commit($tr);


разве не завершает транзакцию ? нет?
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694887
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenestстрока ibase_commit($tr); разве не завершает транзакцию ? нет?

Ткни пальцем в эту строку в твоём коде:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1301706&msg=21657435
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694902
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

у вас какое-то чрезмерное увлечение статическими членами класса. Это зло в квадрате. Вы в них запихиваете почти всё, а это считай уже глобальные переменные
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694928
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисsnakenest,

у вас какое-то чрезмерное увлечение статическими членами класса. Это зло в квадрате. Вы в них запихиваете почти всё, а это считай уже глобальные переменные

Это исключительно в этом модуле, в котором я создал класс инкапсулирующий работу с firebird, потому там и статика, чтобы не плодить соединений в рамках одной обработки запроса сайта.
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694934
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

да, но транзакцию статическим членом класса ты сделал зря. К тому же не следишь за временем её жизни
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694939
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovsnakenestстрока ibase_commit($tr); разве не завершает транзакцию ? нет?

Ткни пальцем в эту строку в твоём коде:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1301706&msg=21657435


Посмотрите внимательно на то что написано:
$res=firebird::execsql("update Accure t set t.Status='F' where t.id=".$this->ID);

посмотрите внимательно на код этой функции:
21657087

Вы видите строку?
Код: php
1.
2.
3.
    ....
               ibase_commit($tr);
   .......
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694953
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

и где там использование созданной тр-ции ?
...
Рейтинг: 0 / 0
Запрос не видит изменения данных таблицы
    #39694964
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

короче ты запутался в трёх соснах. Советую запустить тебе трассировку и посмотреть, когда у тебя начинаются и завершаются транзакции. Заодно увидишь с какими параметрами они реально стартуют. Код твоего класса для работы с firebird одни сплошные макароны.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос не видит изменения данных таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]