[Zope] SQL transaction uncommited?
Gabriel Genellina
gagenellina at softlab.com.ar
Sun Dec 18 19:39:18 EST 2005
At Saturday 17/12/2005 09:31, Vlada Macek wrote:
>in ZopeBook I read that Zope's transaction are tied to SQL backend's
>ones. I do not know whether this applies to ZSQL methods only, but I
>do not expect it. I got this table:
> def manage_afterAdd(self, item, container):
> if item is self:
> self.db = getattr(self,MY_CONNECTION_ID)._v_database_connection
Keeping a _v_ attribute is *not* a good idea - it's suposed to be *volatile*.
It's not clear from this partial fragment, but if self inherits from
Connection, use __call__ instead -i.e. place a () after the object- to
obtain its database connection (using __call__ ensures that the connection
is open).
> def qry(self, query):
> results = self.db.query(query)
> recs = {
> 'names': Results(results).names(),
> 'tuples': Results(results).tuples()
> }
> return recs
Why create a Results object twice?
results = Results(self.db.query(query))...
> def test0(self):
> self.qry('insert into testtable (n) values (10)')
>
> def test1(self):
> self.qry('insert into testtable (n) values (10)')
> self.db.commit()
>
> def test2(self):
> self.qry('insert into testtable (n) values (10)')
> self.qry('commit')
>
> def test3(self):
> self.qry('insert into testtable (n) values (10)')
> return self.qry('select * from testtable')
>
> def test4(self):
> self.qry('insert into testtable (n) values (10); commit')
>
> def test5(self):
> self.qry('insert into testtable (n) values (10); commit')
> return self.qry('select * from testtable')
>
>When I call test0,1,2,3 -- the inserted row is not visible in psql,
>but the sequence is incremented! I'm afraid there is some pending
>transaction I cannot reach at that moment anymore.
>
>The test4,5 properly add the row to table (and increment the seq of
>course) as I can watch via psql immediatelly.
>
>In test3 the returned result does not contain the new row, in test5
>the new row is contained in select.
I don't know how the ProgressSQL adapter is implemented, but *if* every
query() call created a different connection or started a different
transaction -which does not complete until the Zope transaction commits
finally- *then* you would see those results.
Updates made by the *same* transaction should always be available to that
transaction, whatever the trans. isolation level in use.
If this was the case, that may indicate that the Progress adapter is not
properly written.
>What am I doing wrong and how must I arrange it not need to care about
>transactions at all? I expected the SQL transactions are transparent
>in Zope and they are either commited when the webbrowser gets the
>no-exception response and rolled back otherwise.
I've only used the ZODBCDA adapter and it does not show these phenomena;
its SQL transactions *are* coupled to the Zope transaction (I learned that
the hard way, in a corner case...)
Gabriel Genellina
Softlab SRL
More information about the Zope
mailing list