nevermind, you've managed to find a case that trips it up for the connection pool
release today On Wed, May 13, 2020, at 11:51 AM, Mike Bayer wrote: > > > On Wed, May 13, 2020, at 11:39 AM, Kent Bower wrote: >> In this script, conn.close() does *not *call rollback on the transaction. It >> isn't just a logging issue as I've verified from the database that the >> session was not rolled back. > > I can confirm that in master only where things have changed dramatically. > Should not be the case for any released version, please confirm > > >> >> On Wed, May 13, 2020 at 11:31 AM Mike Bayer <mike...@zzzcomputing.com> wrote: >>> __ >>> Haven't looked deeply but so far what you need to know is that conn.close() >>> *ALWAYS* rolls back the transaction, just not at the Engine level, it's at >>> the connection pool level so you won't see it when logging / event hooking >>> on the Engine. turn on echo_pool and you will see this, in modern versions: >>> >>> 2020-05-13 11:25:45,106 DEBUG sqlalchemy.pool.impl.QueuePool Connection >>> <connection object at 0x7f660c367b90; dsn: 'user=scott password=xxx >>> dbname=test host=localhost', closed: 0> being returned to pool >>> 2020-05-13 11:25:45,107 DEBUG sqlalchemy.pool.impl.QueuePool Connection >>> <connection object at 0x7f660c367b90; dsn: 'user=scott password=xxx >>> dbname=test host=localhost', closed: 0> rollback-on-return, via agent >>> >>> your DBSession is not going to close the connection because you have it >>> bound directly to that connection, rather than to the engine, so it assumes >>> it is participating in a larger transaction. 1.4 does amend this behavior >>> to be more clear cut as we are doing away with the "nested" behaviors of >>> Connection. So yes I would not be relying upon DBSession.close() as a means >>> of transaction control if the session is bound to a connection directly. If >>> the session is bound to a connection I would advise ensuring that >>> connection is in a transaction on the outside that you are managing. >>> >>> >>> >>> >>> >>> >>> >>> On Wed, May 13, 2020, at 10:51 AM, Kent wrote: >>>> Mike, et al., >>>> >>>> I've got some questions about closing connections. I suspect my framework >>>> may be at fault, but there is potentially a sqlalchemy issue here as well. >>>> >>>> See attached script with nested transaction and explicit >>>> connection.close(). >>>> >>>> Things are even more complex because versions have handled this >>>> differently in the past: >>>> * on rel_0_9_1 and ealier, the conn.close() *always *actually emitted a >>>> DBAPI ROLLBACK, but on rel_0_9_2+, the previous call to .begin_nested() >>>> now prevents the DBAPI ROLLBACK call, even though the close() is on the >>>> connection itself. I'm not sure if that was an intended change, but it >>>> seems .close() on a connection should always cause ROLLBACK, no? >>>> * rel_1_3_9 and earlier this code raises >>>> sqlalchemy.exc.ResourceClosedError on the last DBSession.close() as it >>>> invokes the registered 'rollback' event with an already-closed connection, >>>> but on current master (1.4.0b1) there is no exception since a rollback >>>> isn't attempted, leaving the db connection in idle transaction. >>>> >>>> On all versions since rel_0_9_1, even after both of the script's finally >>>> clauses (close() statements) but before the program terminates, *the >>>> transaction is still left in transaction in the database, though the >>>> connection's been checked back into the pool.* >>>> >>>> As far as whether my code here is badly formed, my question is: is it >>>> wrong to mix session closing and connection closing or should that be fine? >>>> >>>> (My actual application is obviously more complex, with zope.sqlalchemy & >>>> transaction and frameworks; I boiled it down to this script for demo >>>> purposes and removed those libraries, making this code look weirder.) >>>> >>>> Thanks in advance! >>>> Kent >>>> >>>> -- >>>> SQLAlchemy - >>>> The Python SQL Toolkit and Object Relational Mapper >>>> >>>> http://www.sqlalchemy.org/ >>>> >>>> To post example code, please provide an MCVE: Minimal, Complete, and >>>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >>>> description. >>>> --- >>>> You received this message because you are subscribed to the Google Groups >>>> "sqlalchemy" group. >>>> To unsubscribe from this group and stop receiving emails from it, send an >>>> email to sqlalchemy+unsubscr...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/sqlalchemy/a9d73e26-84c6-4dcf-bb6d-82f541fa1f6d%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/sqlalchemy/a9d73e26-84c6-4dcf-bb6d-82f541fa1f6d%40googlegroups.com?utm_medium=email&utm_source=footer>. >>>> >>>> >>>> *Attachments:* >>>> * connection-close.py >>> >>> >>> -- >>> SQLAlchemy - >>> The Python SQL Toolkit and Object Relational Mapper >>> >>> http://www.sqlalchemy.org/ >>> >>> To post example code, please provide an MCVE: Minimal, Complete, and >>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >>> description. >>> --- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "sqlalchemy" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/sqlalchemy/Lit5HWFiC0U/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> sqlalchemy+unsubscr...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sqlalchemy/6f84e3a9-7d28-44e6-9e13-3f541aac95e4%40www.fastmail.com >>> >>> <https://groups.google.com/d/msgid/sqlalchemy/6f84e3a9-7d28-44e6-9e13-3f541aac95e4%40www.fastmail.com?utm_medium=email&utm_source=footer>. >> >> -- >> SQLAlchemy - >> The Python SQL Toolkit and Object Relational Mapper >> >> http://www.sqlalchemy.org/ >> >> To post example code, please provide an MCVE: Minimal, Complete, and >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> description. >> --- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sqlalchemy+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/CANnF6aFqH7nrtDVd5CrchnoP%2Bz2pY-utazLAcQm%2BfBje785gTA%40mail.gmail.com >> >> <https://groups.google.com/d/msgid/sqlalchemy/CANnF6aFqH7nrtDVd5CrchnoP%2Bz2pY-utazLAcQm%2BfBje785gTA%40mail.gmail.com?utm_medium=email&utm_source=footer>. > > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/b7ff30e4-722c-4324-98ca-6d1afa1693ba%40www.fastmail.com > > <https://groups.google.com/d/msgid/sqlalchemy/b7ff30e4-722c-4324-98ca-6d1afa1693ba%40www.fastmail.com?utm_medium=email&utm_source=footer>. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/95ebb408-7bad-4c0e-a14b-b6fce9a4ada3%40www.fastmail.com.