Mam dosyć nietypowy problem i nie mogę znaleźć przyczyny błędu ani rozwiązania.
Problem występuje w jednej z części aplikacji i dotyczy jednej tabeli. Jej struktura jest następująca:
Kod
CREATE TABLE oceny
(
oceny_id INT NOT NULL AUTO_INCREMENT,
numer_pracownika INT NOT NULL,
data DATE NOT NULL,
ocena VARCHAR(1000),
account_id INT NOT NULL,
PRIMARY KEY(oceny_id),
UNIQUE(numer_pracownika, data),
INDEX(numer_pracownika, data),
CONSTRAINT FOREIGN KEY(numer_pracownika) REFERENCES wtr_pracownicy(numer_pracownika),
CONSTRAINT FOREIGN KEY(account_id) REFERENCES accounts(account_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(
oceny_id INT NOT NULL AUTO_INCREMENT,
numer_pracownika INT NOT NULL,
data DATE NOT NULL,
ocena VARCHAR(1000),
account_id INT NOT NULL,
PRIMARY KEY(oceny_id),
UNIQUE(numer_pracownika, data),
INDEX(numer_pracownika, data),
CONSTRAINT FOREIGN KEY(numer_pracownika) REFERENCES wtr_pracownicy(numer_pracownika),
CONSTRAINT FOREIGN KEY(account_id) REFERENCES accounts(account_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Controller:
<?php require_once('Core/Cube/FrontController/Action.interface.php'); class CreateEmployeesSheetAction implements Action { private $aToken; private $iDay; private $iMonth; private $iYear; private $bIsCorrectly = false; public function __construct($aToken) { // waliduje dane i jęsli wszystko jest ok $this->bIsCorrectly = true, w przeciwnym razie przekierowuje } public function run() { if ($this->bIsCorrectly) { require_once(Config::$MVCModelsPath . '/CreateEmployeesSheetModel.class.php'); $oCreateEmployeesSheetModel = new CreateEmployeesSheetModel(); $oCreateEmployeesSheetModel->create($this->iYear . '-' . $this->iMonth . '-' . $this->iDay); CubeFrontController::redirect(Config::$SystemPath . 'main/pl/EmployeesGradeViewAction/date/' . $this->iYear . '-' . $this->iMonth . '-' . $this->iDay); } else { CubeFrontController::redirect(Config::$SystemPath . 'main/pl/EmployeesGradeViewAction'); } } } ?>
Model:
<?php class CreateEmployeesSheetModel { private $oRegistry; private $oConnection; public function __construct() { $this->oRegistry = CubeRegistry::getInstance(); $this->oConnection = $this->oRegistry->get('oDatabase'); } public function getEmployeesId() { // zwraca tablicę z numerami pracowników } public function create($sDate) { $this->oConnection->query('SELECT count(pax_oceny_id) As count FROM pax_oceny WHERE data='' . $sDate . '''); $iNumberOfResult = $this->oConnection->fetchAll(); if ($iNumberOfResult[0]['count'] == 0) { $this->oConnection->startTransaction(); foreach($this->getEmployeesId() As $aEmployeesId) { $this->oConnection->query('INSERT INTO oceny VALUES (NULL, ' . $aEmployeesId['numer_pracownika'] . ', '' . $sDate . '', NULL, '' . $_SESSION['AccountId'] . '')'); } $this->oConnection->commitTransaction(); } } } ?>
PROBLEM: W losowych momentach skrypt wywala błąd, zatrzymuje swoje wykonywanie i do pliku z logami dostaję taki zapis:
Cytat
EXCEPTION: Nieudane zapytanie: INSERT INTO oceny VALUES (NULL, 173, '2008-11-4', NULL, '1')
REASON: Deadlock found when trying to get lock; try restarting transaction
REASON: Deadlock found when trying to get lock; try restarting transaction
Problem ciężki do zdiagnozowania ponieważ dzieje się to z różnych momentach. Tzn raz skrypt mogę wywołać 30 razy wszystko jest ok a innym razem przy drugim wywołaniu wywala błąd.
Testuję na lokalnym serwerze, podczas testów na programie pracuje tylko jedna osoba.
Proszę o jakieś wskazówki, rady.
Pozdrawiam