![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 7.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
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(); } |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 4 Dołączył: 21.03.2005 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował mkozak 26.07.2010, 14:21:49 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 21:46 |