Dzień dobry,
Moja witryna w PHP5+MySQL składa się zasadniczo z trzech stron:
1. enter_announcement.php - wprowadzanie/edycja ogłoszenia
2. submit_announcement.php - dodanie/modyfikacja ogłoszenia w bazie
3. summary.php - wyświetlenie podsumowania.
Dokładniej rozwiązanie działa tak, że strona enter_announcement.php na submicie ma stronę submit_announcement.php, która na koniec dopiero wywołuje summary.php.
Numer ogłoszenia składa się z trzech części: rok, miesiąc, numer w miesiącu.
Oto szkic submit_announcement.php:
START TRANSACTION
LOCK TABLES announcements WRITE
if (empty($_POST['full_announcement_no'])) { // nowe ogłoszenie
$announcement = new Announcement;
$announcement->initializeWithPOST();
INSERT INTO announcements z nowym numerem MAX+1
} else { // modyfikacja ogłoszenia
$announcement = new Announcement;
$announcement->initializeWithPOST();
$announcement->initializeWithNumber($_POST['full_announcement_no']));
UPDATE announcements
}
UNLOCK TABLES
COMMIT
header('Location: summary.php');
Problem w tym, że nie jestem pewien czy wewnątrz transakcji instrukcja LOCK TABLES jest potrzebna. Tabele blokuje ze względu na współbieżność generowania numerów ogłoszeń (SELECT MAX(no)+1 FROM announcements WHERE year=bieżący AND month=bieżący).
Byłbym wdzięczny za informację, czy wewnątrz tranakcji lokowanie jest potrzebne.