Search Postgresql Archives

Re: [RESEND] Transaction auto-abort causes grief with Spring Framework

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Gregory Stark wrote:

"Tyson Lloyd Thwaites" <tyson.lloydthwaites@xxxxxxxxxxxxxxx> writes:

Normally if we catch the exception, other dbs (Oracle, MSSQL) will let us
keep going.

How do you catch exceptions in these other dbs?
plain java try/catch. In other dbs, if I am in a txn, and I run 3 statements, and one of them fails, spring's jdbc wrapper will throw an exception up to the wrapping template, which will roll the txn back. However if I wrap one of those statements in a try/catch(RuntimeException), then the exception will not propagate, but the db will not automatically fry the whole transaction either.

The way to do it in Postgres is with the SAVEPOINT command.
Yeah, but that is totally unrealistic in our case. I can't go sprinkling "if current db is pgsql then savepoint here" code all through the app. It's a bit annoying that pg insists on being so different to others in this respect, especially since the spec does not mandate it, and appears even to say that the transaction should be allowed to continue. (I read this in another pg thread, I will have to find the argument there, it was a good one). I wish it could be turned off - it seems a bit draconian and heavy-handed to me.

For example, if something goes wrong, I can't even write an event row to our
auditing table!

This is actually a somewhat more complex example than handling an expected
error. For audit records you really want to be able to commit the audit record
independently of the rest of the transaction. These are called "autonomous
transactions" and there's no built-in support for them in Postgres but you can
put together something equivalent using dblink or a second client connection.
it is more like this:

try {
 <do something>
} catch (Exception e) {
 <insert into audit table: hey, it broke>
}

We use notifications that get sent via email and recorded in an event table. So at various places we might notify the user that we had to cancel a process because of an error, and then record the fact that we sent this email... it is all so easy with other dbs, but with postgresql it is a nightmare... the only solution I can see is to remove the declarative transactions in Spring and start using manual transactions blocks around everything that could possibly go wrong... just because of a quirk in postgresql....


---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
      choose an index scan if your joining column's datatypes do not
      match

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux