fix: Revert "fix(db): Store last insert id before reconnect"

This reverts commit df94cceb7b.
There were records of some old IDs being read which is much worse

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2025-05-21 07:55:33 +02:00
parent 0d79156bb2
commit ad7a050f96
No known key found for this signature in database
GPG key ID: F72FA5B49FFA96B0
4 changed files with 10 additions and 43 deletions

View file

@ -28,25 +28,11 @@ class Adapter {
/**
* @param string $table name
*
* @return int id of last insert statement, 0 in case there was no INSERT before or it failed to get the ID
* @return int id of last insert statement
* @throws Exception
*/
public function lastInsertId($table, bool $allowRetry = true): int {
$return = $this->conn->realLastInsertId($table);
if ($return === 0 && $allowRetry) {
/**
* During a reconnect we are losing the connection and when the
* realLastInsertId call is the one triggering the reconnect, it
* does not return the ID. But inside the reconnect, we were able
* to save the last insert id, so calling it a second time is going
* to be successful.
* We can not return the result on the initial call, as we are already
* way deeper in the stack performing the actual database query on
* the doctrine driver.
*/
return $this->lastInsertId($table, false);
}
return $return;
public function lastInsertId($table) {
return (int)$this->conn->realLastInsertId($table);
}
/**

View file

@ -8,7 +8,7 @@
namespace OC\DB;
class AdapterOCI8 extends Adapter {
public function lastInsertId($table, bool $allowRetry = true): int {
public function lastInsertId($table) {
if (is_null($table)) {
throw new \InvalidArgumentException('Oracle requires a table name to be passed into lastInsertId()');
}

View file

@ -9,7 +9,7 @@ namespace OC\DB;
class AdapterPgSql extends Adapter {
public function lastInsertId($table, bool $allowRetry = true): int {
public function lastInsertId($table) {
$result = $this->conn->executeQuery('SELECT lastval()');
$val = $result->fetchOne();
$result->free();

View file

@ -92,8 +92,6 @@ class Connection extends PrimaryReadReplicaConnection {
protected ShardConnectionManager $shardConnectionManager;
protected AutoIncrementHandler $autoIncrementHandler;
protected bool $isShardingEnabled;
protected bool $disableReconnect = false;
protected int $lastInsertId = 0;
public const SHARD_PRESETS = [
'filecache' => [
@ -512,9 +510,9 @@ class Connection extends PrimaryReadReplicaConnection {
* because the underlying database may not even support the notion of AUTO_INCREMENT/IDENTITY
* columns or sequences.
*
* @param ?string $name Name of the sequence object from which the ID should be returned.
* @param string $seqName Name of the sequence object from which the ID should be returned.
*
* @return int the last inserted ID, 0 in case there was no INSERT before or it failed to get the ID
* @return int the last inserted ID.
* @throws Exception
*/
public function lastInsertId($name = null): int {
@ -528,13 +526,8 @@ class Connection extends PrimaryReadReplicaConnection {
* @internal
* @throws Exception
*/
public function realLastInsertId($seqName = null): int {
if ($this->lastInsertId !== 0) {
$lastInsertId = $this->lastInsertId;
$this->lastInsertId = 0;
return $lastInsertId;
}
return (int)parent::lastInsertId($seqName);
public function realLastInsertId($seqName = null) {
return parent::lastInsertId($seqName);
}
/**
@ -903,23 +896,11 @@ class Connection extends PrimaryReadReplicaConnection {
if (
!isset($this->lastConnectionCheck[$this->getConnectionName()]) ||
time() <= $this->lastConnectionCheck[$this->getConnectionName()] + 30 ||
$this->isTransactionActive() ||
$this->disableReconnect
$this->isTransactionActive()
) {
return;
}
if ($this->getDatabaseProvider() === IDBConnection::PLATFORM_MYSQL) {
/**
* Before reconnecting we save the lastInsertId, so that if the reconnect
* happens between the INSERT executeStatement() and the getLastInsertId call
* we are able to return the correct result after all.
*/
$this->disableReconnect = true;
$this->lastInsertId = (int)parent::lastInsertId();
$this->disableReconnect = false;
}
try {
$this->_conn->query($this->getDriver()->getDatabasePlatform()->getDummySelectSQL());
$this->lastConnectionCheck[$this->getConnectionName()] = time();