Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przerwanie generowania strony z bazą
Forum PHP.pl > Forum > Bazy danych
RAM
Chciałbym zapytać o taką rzecz: jak postępować w przypadku gdy
strona używa bazy danych, a może wystąpić błąd przerywający tworzenie strony.
Pytam bo nie wiem czy PHP automatycznie wycofuje transakcje i zamyka połączenie z bazą.
Czy takie rozwiązanie z funkcją shutdownDatabase() ma sens:

function openDatabase() {
global $db, $inTransaction;
$db = new mysqli('localhost', MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
if (!empty($db->connect_error)) {
$db = null;
return false;
}
$db->query('SET NAMES latin2');
$db->query('SET CHARACTER SET latin2 COLLATE latin2_polish_ci');
$db->autocommit(true);
$inTransaction = false;
register_shutdown_function('shutdownDatabase');
return true;
}
function closeDatabase() {
global $db;
if (!is_null($db)) {
$db->close();
}
}
function startTransaction() {
global $db, $inTransaction;
$db->autocommit(false);
$db->query('START TRANSACTION');
$inTransaction = true;
}
function commitTransaction() {
global $db, $inTransaction;
$inTransaction = false;
if (!$db->commit()) {
$db->rollback();
$db->autocommit(true);
error(ERRMSG_DATABASE_OPERATION_FAILED);
return;
}
$db->autocommit(true);
}
function rollbackTransaction() {
global $db, $inTransaction;
$inTransaction = false;
if (!$db->rollback()) {
$db->autocommit(true);
error(ERRMSG_DATABASE_OPERATION_FAILED);
return;
}
$db->autocommit(true);
}
function shutdownDatabase() {
if ($inTransaction) {
rollbackTransaction();
}
closeDatabase();
}
mkozak
Zacznijmy od tego, że tabele MySQL muszą być utworzone na storage-u InnoDB (standardowy MyISAM, czy ISAM poprostu nie ma transakcji i będziesz miał ciągły autocommit).

Reszta zależy od tego co znaczy "przerwanie wyświetlania strony". Jeżeli jest to syntax error - to nic nie było wykonywane. Jeżeli zrobiłeś exit, albo die i tak się przerwało to poleci rollback. Jeżeli wywali ci się skrypt na timeoutcie, albo na zeżartej pamięci w środku transakcji to może się skończyć lockiem na bazie.

"if PHP exits due to a code bug during a transaction, an InnoDB table can remain locked until Apache is restarted."

Podobno w nowszych wersjach PHP-a powyżej 5.2.2 idzie rollback i nie blokuje tabel - ale głowy nie dam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.