Latest posts on Проблема с транзакциями topichttp://python.su/forum/topic/20423/2013-04-18T15:19:04+03:00Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-04-18T15:19:04+03:00dorian108537<blockquote><em>alexbadaloff</em><br/></blockquote>вряд ли драйвер, работал с мускулом. Сильно рыть не было времени, но уверен, что проблемы в pyramid_tm.
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-04-18T14:27:34+03:00alexbadaloff108535<blockquote><em>dorian</em><br/>в чем проблема так и осталось загадкой</blockquote>У меня была подобная засада с PostgreSQL и freepascal. При ошибочном типе данных в инсерте, работа с базой намертво прекращалась. Реконнект не помогал. Только перезапуск процесса. <br/>Также пытался найти способ обработки этой ошибки, и тоже пришел к тому, что добавил проверку данных идущих в запрос.<br/>То есть я к чему: может дело в драйвере?
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-26T20:21:58+02:00dorian104259<blockquote><em>bismigalis</em><br/></blockquote>в чем проблема так и осталось загадкой. Пришлось просто проверять каждое значение для вставки в отдельных try..except
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-24T08:15:03+02:00bismigalis104133<blockquote><em>dorian</em><br/>в общем пришлось проверять каждое значение</blockquote><br/>А можно поподробнее, а то хочется понять в чем там собака была
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-13T19:05:23+02:00dorian103709<blockquote><em>bismigalis</em><br/>не оно? <a href="http://stackoverflow.com/a/575711/1449350">http://stackoverflow.com/a/575711/1449350</a></blockquote>нет<br/>в общем пришлось проверять каждое значение, иного выхода не нашлось. Проблема судя по всему в pyramid_tm ибо этот код вне пирамиды и без pyramid_tm работает как нужно.<br/>
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-11T08:57:15+02:00bismigalis103609не оно? <a href="http://stackoverflow.com/a/575711/1449350">http://stackoverflow.com/a/575711/1449350</a>
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-09T18:01:44+02:00Lexander103540Плюс я бы проверил connection.info перед каждой операцией.
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-09T17:54:51+02:00Lexander103539<blockquote><em>sank</em><br/>Дык вы явно транзакцию запускать пробовали?</blockquote>При условии включенного автокоммита, если явная транзакция сработает, значит либо баг в Алхимии, либо ошибка в алгоритме.<br/><br/>Что выдает монитор операций СУБД?<br/>Возможно, какие-то команды лишние идут.<br/><br/>
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-09T16:42:43+02:00sank103535Дык вы явно транзакцию запускать пробовали?<br/><div class="code"><pre><span class="n">connection</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
<span class="n">trans</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">r1</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">table1</span><span class="o">.</span><span class="n">select</span><span class="p">())</span>
<span class="n">connection</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">table1</span><span class="o">.</span><span class="n">insert</span><span class="p">(),</span> <span class="n">col1</span><span class="o">=</span><span class="mi">7</span><span class="p">,</span> <span class="n">col2</span><span class="o">=</span><span class="s">'this is some data'</span><span class="p">)</span>
<span class="n">trans</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">trans</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
<span class="k">raise</span>
</pre></div>стырено отсюда: <a href="http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html#using-transactions">http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html#using-transactions</a><br/>Я сам по причине лени не пробовал, но думается мне надо туда копать …<br/>Если не поможет, то, думаю, нужно явный execute делать, вместо использования объектов.<br/>Либо курить доку и разбираться чо там ORM делает в случае появления SQL-ных эксепшенов.<br/><br/>… у вас ситуация немного не штатная. Вы хотите на эксепшене ничего не делать, продолжая транзакцию, поэтому тут ORM может вам палки в колёса ставить.
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-09T15:56:29+02:00dorian103532<blockquote><em>Lexander</em><br/>После DBSession.rollback() в обработке исключения нужно создать новый объект DBSession.Но это больше похоже на устранение последствий, а не причин.После изменения модели нужно делать DBSession.flush(), чтобы обновить состояние модели.Проверьте состояние DBSession.autoflush. Должно быть True.И только после обработки всех данных закоммитить транзакцию во внешнем блоке try…except (сейчас у вас в коде его нет).</blockquote><br/>Перед тем как создавалась тема, были испробованы: <br/>DBSession.flush()+DBSession.rollback() - ResourceClosedError: The transaction is closed <br/>transaction.commit()+transaction.abort() - на первой итерации закрывается транзакция<br/>автокомит и автофлуш включены<br/><br/><blockquote><em>sank</em><br/>Такое ощущение, что в каждой итерации начинается новая транзакция, т.к. ошибка “ To begin a new transaction with this Session, first issue Session.rollback()” появляется тогда, когда есть незакрытая транзакция и какая-то новая транзакция пытается что-то делать в базе.Может как-то явно попробовать начать транзакцию и в ней все изменения делать?</blockquote>Вся печаль в том, что закомитить можно через transaction.commit(), но как и писал выше, это автоматом прекращает выполнение кода.
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-09T12:49:17+02:00Lexander103521После DBSession.rollback() в обработке исключения нужно создать новый объект DBSession.<br/>Но это больше похоже на устранение последствий, а не причин.<br/><br/>После изменения модели нужно делать DBSession.flush(), чтобы обновить состояние модели.<br/>Проверьте состояние DBSession.autoflush. Должно быть True.<br/>И только после обработки всех данных закоммитить транзакцию во внешнем блоке try…except (сейчас у вас в коде его нет).
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-09T09:14:37+02:00sank103508Такое ощущение, что в каждой итерации начинается новая транзакция, т.к. ошибка “ To begin a new transaction with this Session, first issue Session.rollback()” появляется тогда, когда есть незакрытая транзакция и какая-то новая транзакция пытается что-то делать в базе.<br/>Может как-то явно попробовать начать транзакцию и в ней все изменения делать?
Веб-технологии :: Pyramid / Pylons / TurboGears :: Проблема с транзакциями
2013-01-08T18:17:18+02:00dorian103469Пытаемся сделать множественный insert в базу. Если данные не корректны - проблема с индексами, типами и тд., то такие строки нам не нужны. <br/>Получился код представления:<br/><div class="code"><pre><span class="nd">@view_config</span><span class="p">(</span><span class="n">route_name</span><span class="o">=</span><span class="s">"loader"</span><span class="p">,</span>
<span class="n">request_method</span><span class="o">=</span><span class="s">"POST"</span><span class="p">,</span>
<span class="n">renderer</span><span class="o">=</span><span class="s">"json"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_loader</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c"># ........</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">els</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="c"># .......</span>
<span class="n">ask</span> <span class="o">=</span> <span class="n">page</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="n">el</span><span class="o">.</span><span class="n">ask_xpath</span><span class="p">)</span>
<span class="n">bid</span> <span class="o">=</span> <span class="n">page</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="n">el</span><span class="o">.</span><span class="n">bid_xpath</span><span class="p">)</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">DBSession</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Rate</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">Rate</span><span class="o">.</span><span class="n">date</span><span class="o">==</span><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">())</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="k">if</span> <span class="n">r</span><span class="p">:</span> <span class="n">DBSession</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">Rate</span><span class="p">(</span><span class="n">ask</span> <span class="o">=</span> <span class="n">ask</span><span class="p">,</span> <span class="n">bid</span> <span class="o">=</span> <span class="n">bid</span><span class="p">)</span>
<span class="n">DBSession</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">rate</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">flash</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">queue</span><span class="o">=</span><span class="s">'loader'</span><span class="p">);</span>
<span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">parse_progress</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">pop_flash</span><span class="p">(</span><span class="s">'loader'</span><span class="p">))</span>
</pre></div><br/>Выполнение кода приводит к ошибке<br/>InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback().<br/><br/>Если ставим DBSession.rollback() в блок исключений, то получаем<br/>ResourceClosedError: The transaction is closed<br/><br/>Похожий вопрос задавался <a href="http://stackoverflow.com/questions/7545645/sqlalchemy-re-saving-models-unique-field-after-trying-to-save-non-unique-value">здесь</a>, но предложенные решения не рабочие<br/>