[Zope] MySQL Transaction/Locking/etc
Michael Long
mlong@datalong.com
Wed, 11 Dec 2002 09:38:49 -0500
I believe that your premise that ZSQL can only do one query is false. I am able to handle this exact situation (using postgres) with the following in a single ZSQL method:
insert into mytable(id,col1,col2) values(nextval('seq_id'),val1, val2);
select curval('seq_id');
This will cause the ZSQL method to return the newly inserted id to you and this all happens within a single transaction.
-mike
> Hi All,
> Twice now I've come into what must be a fairly common problem when using SQL
> databases in Zope: I simply want MySQL to give me a unique identifier and I
> need to retrieve what its value is to continue using the correct record.
>
> The MySQL side of this is very straightforward -- I just make an
> AUTO_INCREMENT field and use LAST_INSERT_ID() to get what its value was.
>
> I'm less sure how safe this is in Zope -- the whole point being, of course,
> that when running multi-threaded, another thread *could* stick another record
> into the table, so that LAST_INSERT_ID() comes up with the wrong value. As a
> perhaps naive attempt to handle this in a previous application (for which the
> consequences of an error were not too severe), I simply used the threading
> module and acquired a lock -- I'm hoping that this will keep at least any
> threads within my current Zope process from interfering. (Please forgive my
> ignorance of threads if this betrays a deep misunderstanding! Corrections
> will be much appreciated. ;-)).
>
> I can however, picture installations with more than one Zope *process*
> running, but accessing the same database, which would presumeably allow
> collisions under high loads. :-(
>
> I tried using MySQL's table-locking mechanism to do this, but the lock would
> cause *all* my queries to fail -- including the ones that I was supposed to
> be protecting. Since each ZSQL method can only do one query, I couldn't
> figure out how to run a batch of them.
>
> MySQL can do transactional tables nowadays, but I'm not sure if they would
> actually make sense for this application -- this "get a unique new record id"
> function is the only thing I really need to do this way. And I'm not even
> sure that transactions would be proof against this (would transactions stop
> the LAST_INSERT_ID() being incremented in the middle of the transaction? It
> doesn't seem like it would actually violate the transaction model to do that).
>
> There doesn't seem to be much on the Zope website or in the ZDG about how to
> deal with this situation (or perhaps I don't know what to search for). Has
> anyone else solved it? Is the thread-locking solution adequate, or is there
> a better way?
>
> Any suggestions?
>
> Thanks,
> Terry
>
> --
> Terry Hancock ( hancock at anansispaceworks.com )
> Anansi Spaceworks http://www.anansispaceworks.com
>
> "Some things are too important to be taken seriously"
>
> _______________________________________________
> Zope maillist - Zope@zope.org
> http://lists.zope.org/mailman/listinfo/zope
> ** No cross posts or HTML encoding! **
> (Related lists -
> http://lists.zope.org/mailman/listinfo/zope-announce
> http://lists.zope.org/mailman/listinfo/zope-dev )
>
>