Re: Weird prepared stmt behavior
| От | Oliver Jowett |
|---|---|
| Тема | Re: Weird prepared stmt behavior |
| Дата | |
| Msg-id | 40941FF2.4080903@opencloud.com обсуждение исходный текст |
| Ответы |
Re: [HACKERS] Weird prepared stmt behavior
|
| Список | pgsql-jdbc |
(I'm not on -hackers, but saw this in the archives) Alvaro Herrera wrote: > On Fri, Apr 30, 2004 at 09:44:52PM -0400, Tom Lane wrote: >> Alvaro Herrera <alvherre ( at ) dcc ( dot ) uchile ( dot ) cl> writes: >> > Is this expected? If so, why? I'd expect the prepared stmt to be >> > deallocated. >> >> prepare.c probably should have provisions for rolling back its state to >> the start of a failed transaction ... but it doesn't. >> >> Before jumping into doing that, though, I'd want to have some >> discussions about the implications for the V3 protocol's notion of >> prepared statements. The protocol spec does not say anything that >> would suggest that prepared statements are lost on transaction rollback, >> and offhand it seems like they shouldn't be because the protocol is >> lower-level than transactions. > > Right now there is no distinction between a PREPARE prepared statement > and a protocol-level one. If we want to have the v3proto's statements > behave different from PREPARE's, it's just a matter of adding a new > field into the PreparedStatement. I can do that and make them behave > different if people think this is how it should be. > > I don't really have an opinion on whether protocol-level should behave > different. What do people think? At least from the JDBC driver's point of view, having prepared statements roll back is more work for the driver. Currently it uses PREPARE/EXECUTE statements, but eventually it'll use the protocol-level messages. When the JDBC driver is given a query to execute and decides to use server-side preparation, it sends a PREPARE (or eventually a Parse message). Thereafter, when that same query is executed it will send an EXECUTE (or Bind/Execute) instead of the full query. It does this by setting some state in the driver-side object representing the query to say "this query is prepared with name 'foo'". If PREPARE can roll back, the driver must maintain a set of all statements that were sucessfully PREPAREd in the current transaction, and fix up the corresponding query object state whenever a transaction rolls back. From that point of view, it's much simpler to keep PREPARE (or at least Parse) as it currently is. I suspect the same argument applies to any interface layer that uses PREPARE or Parse automatically. -O
В списке pgsql-jdbc по дате отправления: