SQLite3::busyTimeout

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

SQLite3::busyTimeout — Define el gestor de espera de la conexión

Descripción

public function SQLite3::busyTimeout(int $milliseconds): bool

Define el gestor de espera que aguardará hasta que la base de datos no esté bloqueada o hasta que se alcance el tiempo límite.

El gestor de espera está integrado en SQLite, por lo que no es necesario proporcionar ninguna retrollamada. Cuando una sentencia encuentra la base de datos bloqueada por otra conexión, SQLite sigue reintentando durante un máximo de milliseconds. Si la base de datos sigue bloqueada pasado ese tiempo, la sentencia falla con un error database is locked (SQLITE_BUSY).

La forma en que se manifiesta ese fallo depende de SQLite3::enableExceptions(). Si las excepciones están habilitadas, se lanza una SQLite3Exception. En caso contrario, se emite un E_WARNING y el método que ejecutó la sentencia, como SQLite3::exec() o SQLite3::query(), devuelve false.

Por defecto no se define ningún gestor de espera, por lo que una sentencia falla de inmediato si la base de datos está bloqueada.

Parámetros

milliseconds

El número máximo de milisegundos a esperar un bloqueo. Establecer este valor a cero o a un valor inferior desactivará un gestor de espera previamente definido.

Valores devueltos

Devuelve true si se definió el tiempo de espera, o false si ocurre un error. El valor devuelto solo indica si se definió el tiempo de espera. No significa que las sentencias posteriores obtengan el bloqueo a tiempo.

+add a note

User Contributed Notes 3 notes

up
11
ppryor63 at gmail dot com
12 years ago
The busyTimeout() method and related API sqlite3_busy_timeout() is a connection level attribute and affects whole connection and should be set once after opening connection.  Do not set to zero or you will encounter "Database is busy" error message when calling query, querySingle, prepare, or execute methods.  Also ensure that sqlite3 library is compiled with HAVE_USLEEP defined, otherwise busyTimeout() can only time out in seconds.  It is very highly recommended to call busyTimeout() with non-zero timeout for reliability in concurrent environment.
up
6
anthony at domps dot fr
5 years ago
It's possible to use PRAGMA to set busyTimeout (milliseconds) :

<?php

$db = new SQLite3('my.db');
$db->exec("PRAGMA busy_timeout=5000");

?>
up
3
dkarnout at gmail dot com
11 years ago
For SQLite2 (http://php.net/manual/en/function.sqlite-busy-timeout.php), PHP sets the default busy timeout to be 60 seconds when the database is opened.
However, this does not happen for v3 and it has to be done manually.

My personal experience is that the default value of SQLite3, which is 0, is not enough when you have to do consecutive read/write commits and the file has not been accessed for long time.