Re: Sequence's value can be rollback after a crashed recovery.
Laurenz Albe <laurenz.albe@cybertec.at>
From: Laurenz Albe <laurenz.albe@cybertec.at>
To: Andy Fan <zhihui.fan1213@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2021-11-22T07:22:24Z
Lists: pgsql-hackers
On Mon, 2021-11-22 at 14:57 +0800, Andy Fan wrote:
> Should we guarantee the sequence's nextval should never be rolled back
> even in a crashed recovery case?
> I can produce the rollback in the following case:
>
> Session 1:
> CREATE SEQUENCE s;
> BEGIN;
> SELECT nextval('s'); \watch 0.01
>
> Session 2:
> kill -9 {sess1.pid}
>
> After the restart, the nextval('s') may be rolled back (less than the
> last value from session 1).
>
> The reason is because we never flush the xlog for the nextval_internal
> for the above case. So if
> the system crashes, there is nothing to redo from. It can be fixed
> with the following online change
> code.
>
> @@ -810,6 +810,8 @@ nextval_internal(Oid relid, bool check_permissions)
> recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG);
>
> PageSetLSN(page, recptr);
> +
> + XLogFlush(recptr);
> }
>
>
> If a user uses sequence value for some external systems, the
> rollbacked value may surprise them.
> [I didn't run into this issue in any real case, I just studied xlog /
> sequence stuff today and found this case].
I think that is a bad idea.
It will have an intolerable performance impact on OLTP queries, doubling
the number of I/O requests for many cases.
Perhaps it would make sense to document that you should never rely on
sequence values from an uncommitted transaction.
Yours,
Laurenz Albe
Commits
-
Doc: improve documentation about nextval()/setval().
- b0a7161c5640 11.15 landed
- 6d1bdd5e0712 14.2 landed
- 6365e3a0535f 12.10 landed
- 499552273d47 13.6 landed
- 09c11134916c 10.20 landed
- 4ac452e2285d 15.0 landed