Это скорее разъяснение к нескольким комментариям, чем реальный новый ответ, но здесь оно подходит лучше.select max (id) работает нормально, пока клиент находится в сериализуемой транзакции.В pgsql вы можете доказать это себе.Откройте два сеанса psql и запустите его сначала с подтверждением чтения по умолчанию, а затем в сериализуемом:
p1: create table test (id serial);
p1 and p2: begin;
p1 and p2: set transaction isolation level serializable;
p1: insert into test values (DEFAULT);
p2: insert into test values (DEFAULT);
p1: select max(id) from test;
1
p2: select max(id) from test;
2
p2: commit;
p1: select max(id) from test;
2
Однако с подтверждением чтения:
p1: create table test (id serial);
p1 and p2: begin;
p1 and p2: set transaction isolation level read committed;
p1: insert into test values (DEFAULT);
p2: insert into test values (DEFAULT);
p1: select max(id) from test;
1
p2: select max(id) from test;
2
p2: commit;
p1: select max(id) from test;
1
Сериализированные транзакции с точки зрения производительности могутотрицательные воздействия или приводящие к неудачным транзакциям, которые необходимо откатить и повторить, и т. д.
Возврат или currval () - гораздо лучшие идеи.Однако говорить о том, что max (id) просто нельзя доверять, неверно, если выполняемая транзакция сериализуема.