Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос не видит изменения данных таблицы / 20 сообщений из 20, страница 1 из 1
28.08.2018, 21:36
    #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
28.08.2018, 21:50
    #39694597
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не видит изменения данных таблицы
snakenest,

по приведённому тексту не видно где ты стартуешь и завершаешь транзакцию.
...
Рейтинг: 0 / 0
29.08.2018, 07:51
    #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
29.08.2018, 07:55
    #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
29.08.2018, 08:22
    #39694661
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не видит изменения данных таблицы
snakenestи для читающей
Код: php
1.
IBASE_READ || IBASE_COMMITTED || IBASE_REC_VERSION || IBASE_NOWAIT

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

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

Попробуй заменить на ibase_prepare + ibase_execute
...
Рейтинг: 0 / 0
29.08.2018, 09:39
    #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
29.08.2018, 11:33
    #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
29.08.2018, 12:09
    #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
29.08.2018, 12:12
    #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
29.08.2018, 12:16
    #39694859
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не видит изменения данных таблицы
snakenestКак видите, транзакция используется во всех вариантах выполнения запроса

Но при этом она глобальная и никогда не завершается. Прэлеестно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.08.2018, 12:22
    #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
29.08.2018, 12:42
    #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
29.08.2018, 12:49
    #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
29.08.2018, 13:04
    #39694902
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не видит изменения данных таблицы
snakenest,

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

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

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

да, но транзакцию статическим членом класса ты сделал зря. К тому же не следишь за временем её жизни
...
Рейтинг: 0 / 0
29.08.2018, 13:45
    #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
29.08.2018, 13:51
    #39694953
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос не видит изменения данных таблицы
snakenest,

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

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


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