From: | "Peter J(dot) Holzer" <hjp-pgsql(at)hjp(dot)at> |
---|---|
To: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: Information on savepoint requirement within transctions |
Date: | 2018-01-31 18:06:40 |
Message-ID: | 20180131180640.k56anmhgnfxy3oin@hjp.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 2018-01-29 06:36:41 -0700, David G. Johnston wrote:
> On Mon, Jan 29, 2018 at 1:37 AM, Robert Zenz <robert(dot)zenz(at)sibvisions(dot)com>
> wrote:
>
> Documentation, bug report, mailing list discussions,
> something like that. In particular I'm interested in the questions:
>
> * Why are they required in combination with failing statements (when every
> other database does an "automatic savepoint and rollback" for a failed
> statement)?
> * When was that behavior chosen? Was it always like that? Was it adopted
> later?
> * What is the design decision behind it?
>
> There is a lot of information on what savepoints are and how they work (and
> also
> thanks to you I'm now fairly certain I have good grasp on them), but I fail
> to
> locate documentation on these questions.
>
>
> Those questions would not be answered in user-facing documentation.
I think the first (and possibly last) question should be answered in
user-facing documentation. To understand something I don't just need to
know how something works, but also why it works that way. This is
especially the case if the behaviour differs from similar systems.
I think the reason for the behaviour of Oracle, MySQL, etc. is that a
an error in an SQL statement is not necessarily an error in business
logic. One might reasonably write code like this:
begin transaction
...
insert into foo ...
if error == unique_key_violation:
select id from foo where ...
update foo where id=...
...
commit;
Indeed I'm quite sure that I have written something like this several
times. I have also tested tables or columns for existence simply by
selecting from them.
The reason for the PostgreSQL behaviour is probably because it is safer:
If it's the programmer's responsibility to test for the failure of
individual SQL statements, it is quite likely that the programmer
forgets a check and commits inconsistent data. This can't happen with
the PostgreSQL model. If the programmer wants to tolerate and error,
they have to handle it explicitely (with a savepoint or even a full
transaction).
I can't really think of a reason why the MSSQL behaviour might be
useful, but I'm sure that they had a use-case in mind when they designed
this.
hp
--
_ | Peter J. Holzer | we build much bigger, better disasters now
|_|_) | | because we have much more sophisticated
| | | hjp(at)hjp(dot)at | management tools.
__/ | http://www.hjp.at/ | -- Ross Anderson <https://www.edge.org/>
From | Date | Subject | |
---|---|---|---|
Next Message | Peter J. Holzer | 2018-01-31 18:09:28 | Re: Information on savepoint requirement within transctions |
Previous Message | Eugene Pirogov | 2018-01-31 17:56:03 | Issue with WAL logs temporary not replaying |