Re: [RFC] Transaction management overhaul is necessary? - Mailing list pgsql-hackers
From | Tsunakawa, Takayuki |
---|---|
Subject | Re: [RFC] Transaction management overhaul is necessary? |
Date | |
Msg-id | 0A3221C70F24FB45833433255569204D1F636345@G01JPEXMBYT05 Whole thread Raw |
In response to | Re: [RFC] Transaction management overhaul is necessary? (Craig Ringer <craig@2ndquadrant.com>) |
List | pgsql-hackers |
From: Craig Ringer [mailto:craig@2ndquadrant.com] > >> This was because psqlODBC starts and ends a subtransaction for each > >> SQL statement by default to implement statement-level rollback. And > >> PostgreSQL creates one CurTransactionContext memory context, which is > >> 8KB, for each subtransaction and retain them until the top transaction > ends. > > Surely that's where to start then. Find a way to pool and re-use, fully > release, or otherwise be done with transaction contexts for released > savepoints. Yes, I'll investigate this. Any reference information would be appreciated on why the CurTransactionContexts had to be retained,and whether it's difficult to circumvent. > You can control transaction level rollback in psqlODBC directly. You do > not need to fall back to the old protocol. Check the driver options. That driver option is Protocol=7.4-1. The name is misleading, as the driver now ignores version part (7.4), and interprets1 as transaction-rollback. > Right. We can't just fire off each statement wrapped in SAVEPOINT and RELEASE > SAVEPOINT because we need to get the result of the statement and decide > whether to ROLLBACK TO SAVEPOINT or RELEASE SAVEPOINT. It only requires > two round trips if you shove the SAVEPOINT in with the intended statement, > but it's still messy. > > I'd like to see an alternative statement with semantics more akin to COMMIT > - which automatically into ROLLBACK if the tx is aborted. > COMMIT SAVEPOINT would be too confusing since it's not truly committed. > I don't know what to call it. But basically something that does RELEASE > SAVEPOINT [named savepoint] unless the subxact is in aborted state, in which > case it does ROLLBACK TO [named savepoint]. > Bonus points for letting it remember the last savepoint created and use > that. > > Furthermore, we should really add it on the protocol level so drivers can > send subtransaction control messages more compactly, without needing to > go through the parser etc, and without massively spamming the logs. For > this purpose savepoint names would be internally generated so the driver > wouldn't have to send them. We'd log savepoint boundaries when transaction > logging was enabled. Since the client would send the first such protocol > request we could do it on the sly without a protocol version bump; clients > could just check server version and not use the new messages for older > servers. If they send it to an older server they get a protocol error, which > is fine. I'm simply thinking of proposing a new GUC, something like "SET auto_rollback = {none | statement | transaction}", wherenone is the default and traditional behavior. > > You should to implement a CALL statement - that can be independent on > > outer transaction. The behave inside procedure called by CALL > > statement should be same like client side - and there you can controll > > transactions explicitly without nesting. > > I agree that'd be desirable. Top level "procedures" are necessary for this, > really. > > This would also enable us to return multiple result sets. > > We'd probably have to start at least one small read-only tx for the initial > cache access to look up the proc and set everything up, but if we don't > allocate xids local transactions are super cheap. OK, that would be a very big challenge... I can't imagine how difficult it will be now. But supporting the stored procedurewith CALL statement would be a wall to overcome. > However, I think trying to tackle the memory context bloat reported upthread > would be a more effective starting point since it immediately targets the Yes, I think I'll address this. Maybe I'll start different threads for each topic: 1. Memory context bloat 2. Statement-level rollback 3. Stored procedures where transactions can be ended and started Regards Takayuki Tsunakawa
pgsql-hackers by date: